@supalive/core 0.1.5 → 1.0.0
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/bytes-AuEkyxeU.js +19 -0
- package/dist/bytes-AuEkyxeU.js.map +1 -0
- package/dist/codec-BHAmGEIQ.js +62 -0
- package/dist/codec-BHAmGEIQ.js.map +1 -0
- package/dist/{helper-zdJT5FUc.js → helper-wGbzz6zo.js} +2 -18
- package/dist/helper-wGbzz6zo.js.map +1 -0
- package/dist/{index-CTyXKcq_.d.ts → index-CaWMDqq0.d.ts} +21 -3
- package/dist/index-CaWMDqq0.d.ts.map +1 -0
- package/dist/index-DouKwYL6.d.ts +1754 -0
- package/dist/index-DouKwYL6.d.ts.map +1 -0
- package/dist/{mysql-C8SN443m.d.ts → mysql-Bxurg_PH.d.ts} +2 -2
- package/dist/{mysql-C8SN443m.d.ts.map → mysql-Bxurg_PH.d.ts.map} +1 -1
- package/dist/mysql-Cxd4Uq5p.d.ts +104 -0
- package/dist/mysql-Cxd4Uq5p.d.ts.map +1 -0
- package/dist/{mysql-DELSRrpY.js → mysql-bvnjYWvZ.js} +5 -4
- package/dist/{mysql-DELSRrpY.js.map → mysql-bvnjYWvZ.js.map} +1 -1
- package/dist/{overlap-checker-CVkbbuEQ.js → overlap-checker-Ct_HP_iB.js} +4 -4
- package/dist/{overlap-checker-CVkbbuEQ.js.map → overlap-checker-Ct_HP_iB.js.map} +1 -1
- package/dist/{postgres-DE-XyNAQ.js → postgres-B8u1YN8X.js} +5 -4
- package/dist/{postgres-DE-XyNAQ.js.map → postgres-B8u1YN8X.js.map} +1 -1
- package/dist/{postgres-D_gwCHx-.d.ts → postgres-CfT_aDx3.d.ts} +2 -2
- package/dist/{postgres-D_gwCHx-.d.ts.map → postgres-CfT_aDx3.d.ts.map} +1 -1
- package/dist/postgres-Ck-xt72U.d.ts +108 -0
- package/dist/postgres-Ck-xt72U.d.ts.map +1 -0
- package/dist/{schema-SKcIWHfo.js → procedure-DX87tyef.js} +2 -45
- package/dist/procedure-DX87tyef.js.map +1 -0
- package/dist/{query-CbQLjeME.js → query-Bh0RNxDz.js} +24 -64
- package/dist/query-Bh0RNxDz.js.map +1 -0
- package/dist/{realtime_db-D9p2X2PH.js → realtime_db-DOCgqbwi.js} +4 -3
- package/dist/{realtime_db-D9p2X2PH.js.map → realtime_db-DOCgqbwi.js.map} +1 -1
- package/dist/router-DlTYWpop.js.map +1 -1
- package/dist/schema-Dd7u0A1L.js +109 -0
- package/dist/schema-Dd7u0A1L.js.map +1 -0
- package/dist/src/client/index.d.ts +1 -1
- package/dist/src/client/index.js +6 -5
- package/dist/src/client/index.js.map +1 -1
- package/dist/src/exports/codegen.d.ts +38 -0
- package/dist/src/exports/codegen.d.ts.map +1 -0
- package/dist/src/exports/codegen.js +134 -0
- package/dist/src/exports/codegen.js.map +1 -0
- package/dist/src/exports/mysql.d.ts +1 -1
- package/dist/src/exports/mysql.js +1 -1
- package/dist/src/exports/postgres.d.ts +1 -1
- package/dist/src/exports/postgres.js +1 -1
- package/dist/src/exports/procedure.d.ts +2 -2
- package/dist/src/exports/procedure.js +5 -4
- package/dist/src/exports/schema-sql.d.ts +18 -0
- package/dist/src/exports/schema-sql.d.ts.map +1 -0
- package/dist/src/exports/schema-sql.js +161 -0
- package/dist/src/exports/schema-sql.js.map +1 -0
- package/dist/src/exports/server.d.ts +4 -4
- package/dist/src/exports/server.d.ts.map +1 -1
- package/dist/src/exports/server.js +4 -9
- package/dist/src/exports/server.js.map +1 -1
- package/dist/src/exports/subscription-manager-worker-entry.js +2 -3
- package/dist/src/exports/subscription-manager-worker-entry.js.map +1 -1
- package/dist/src/exports/types.d.ts +2 -2
- package/dist/src/exports/types.js +2 -2
- package/dist/subscription-worker-CqoWp6zB.js +511 -0
- package/dist/subscription-worker-CqoWp6zB.js.map +1 -0
- package/dist/subscription-worker-PtmJWEj1.js +511 -0
- package/dist/subscription-worker-PtmJWEj1.js.map +1 -0
- package/dist/{subscription-worker-BurdPO8d.js → subscription-worker-pahX0zxg.js} +7 -7
- package/dist/{subscription-worker-BurdPO8d.js.map → subscription-worker-pahX0zxg.js.map} +1 -1
- package/dist/{types_db-Ctf-ksoy.js → types_db-DXj_l9n-.js} +2 -2
- package/dist/{types_db-Ctf-ksoy.js.map → types_db-DXj_l9n-.js.map} +1 -1
- package/dist/types_server-BW1ys_SK.d.ts +216 -0
- package/dist/types_server-BW1ys_SK.d.ts.map +1 -0
- package/dist/types_server-Dk6o_B7N.js.map +1 -1
- package/dist/types_server-Dpsi0wpG.d.ts +216 -0
- package/dist/types_server-Dpsi0wpG.d.ts.map +1 -0
- package/dist/types_server-DzrIccyO.d.ts +216 -0
- package/dist/types_server-DzrIccyO.d.ts.map +1 -0
- package/dist/{types_server-Ch56y8L3.d.ts → types_server-TFo6SWDH.d.ts} +2 -2
- package/dist/{types_server-Ch56y8L3.d.ts.map → types_server-TFo6SWDH.d.ts.map} +1 -1
- package/package.json +7 -2
- package/dist/helper-zdJT5FUc.js.map +0 -1
- package/dist/index-CTyXKcq_.d.ts.map +0 -1
- package/dist/query-CbQLjeME.js.map +0 -1
- package/dist/schema-SKcIWHfo.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DouKwYL6.d.ts","names":[],"sources":["../src/db/types_db.ts","../src/server/subscription-manager-types.ts","../src/db/cache.ts","../src/db/db.ts","../src/db/schema.ts","../src/db/query.ts","../src/db/context.ts","../src/db/query_definition.ts","../src/db/realtime_db.ts","../src/router/procedure.ts","../src/router/router.ts","../src/client/ws_client_manager.ts","../src/db/types_client_rpc.ts","../src/client/client.ts","../src/client/caller_client.ts"],"mappings":";;;;;;;KAIY,QAAA;AAAA,cAEC,YAAA,EAAY,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CAAA,YAAA;AAAA,cAEZ,qBAAA,EAAqB,CAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;KAOtB,eAAA,GAAkB,CAAA,CAAE,KAAK,QAAQ,qBAAA;AAAA,KAGjC,SAAA,GACR,aAAA;EACE,IAAA;EAAa,QAAA,EAAU,SAAA;AAAA;EACvB,IAAA;EAAY,QAAA,EAAU,SAAA;AAAA;AAAA,cACf,eAAA,EAAiB,CAAA,CAAE,OAAO,CAAC,SAAA;AAAA,cAQ3B,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmBpB,aAAA,GAAgB,CAAA,CAAE,KAAK,QAAQ,mBAAA;AAAA,cAE9B,kBAAA,EAAkB,CAAA,CAAA,SAAA;;;;KAInB,YAAA,GAAe,CAAA,CAAE,KAAK,QAAQ,kBAAA;AAAA,cAE7B,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;KAIlB,WAAA,GAAc,CAAA,CAAE,KAAK,QAAQ,iBAAA;;KAG7B,SAAA,GAAY,SAAS;AAAA,iBAOjB,kBAAA,CAAmB,EAAA,mBAAqB,OAAA,aAAkB,UAAU;AAAA,iBAcpE,gBAAA,CAAiB,KAAA,EAAO,UAAA,aAAuB,UAAU;AAAA,iBAQzD,aAAA,CAAc,KAAA,EAAO,UAAA,aAAuB,UAAU;AAAA,cAuBzD,eAAA,EAAe,CAAA,CAAA,SAAA;;;;;;;KAUhB,SAAA,GAAY,CAAA,CAAE,KAAK,QAAQ,eAAA;AAAA,cAE1B,kBAAA,EAAkB,CAAA,CAAA,SAAA;;;;;;;KAOnB,YAAA,GAAe,CAAA,CAAE,KAAK,QAAQ,kBAAA;;;;;cAM7B,eAAA,EAAe,CAAA,CAAA,SAAA;;;;;;;;;;KAUhB,SAAA,GAAY,CAAA,CAAE,KAAK,QAAQ,eAAA;AAAA,cAE1B,kBAAA,EAAkB,CAAA,CAAA,SAAA;;;;;;;;;;KAUnB,YAAA,GAAe,CAAA,CAAE,KAAK,QAAQ,kBAAA;AAAA,cAE7B,eAAA,EAAe,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;KAChB,SAAA,GAAY,CAAA,CAAE,KAAK,QAAQ,eAAA;AAAA,cAE1B,kBAAA,EAAkB,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;KACnB,YAAA,GAAe,CAAA,CAAE,KAAK,QAAQ,kBAAA;AAAA,cAE7B,aAAA,EAAa,CAAA,CAAA,OAAA;;;;;KACd,OAAA,GAAU,CAAA,CAAE,KAAK,QAAQ,aAAA;AAAA,cAExB,gBAAA,EAAgB,CAAA,CAAA,SAAA;;;;;;;;;;;;;KAiBjB,UAAA,GAAa,CAAA,CAAE,KAAK,QAAQ,gBAAA;AAAA,UAEvB,cAAA;EACf,EAAA,EAAI,UAAA;EACJ,EAAA;EACA,OAAA,EAAS,UAAA;EACT,IAAA,EAAM,UAAA;EAEN,WAAA,GAAc,MAAA;AAAA;AAAA,UAGC,cAAA;EACf,MAAA,EAAQ,CAAA;EACR,QAAA,EAAU,UAAA;EACV,QAAA,EAAU,QAAA;AAAA;AAAA,UAGK,UAAA;EACf,EAAA;EACA,IAAA,EAAM,CAAA;EACN,OAAA,EAAS,SAAS;AAAA;AAAA,cAGP,wBAAA,EAAwB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;KAIzB,kBAAA,GAAqB,CAAA,CAAE,KAAK,QAAQ,wBAAA;AAAA,cAEnC,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;KAGtB,eAAA,GAAkB,CAAA,CAAE,KAAK,QAAQ,qBAAA;AAAA,cAEhC,sBAAA,EAAsB,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CAAA,SAAA;AAAA,KACvB,gBAAA,GAAmB,CAAA,CAAE,KAAK,QAAQ,sBAAA;AAAA,UAE7B,WAAA;EACf,WAAA;EACA,OAAA;EACA,OAAA;EACA,UAAA,IAAc,OAAA,UAAiB,KAAA,EAAO,gBAAgB;AAAA;AAAA,cAG3C,QAAA,EAAU,WAAiD;AAAA,cAE3D,aAAA,EAAe,WAI3B;AAAA,cAEY,gBAAA,SAAyB,KAAK;EAAA,SAEvB,MAAA;EAAA,SACA,cAAA;cADA,MAAA,UACA,cAAA;EAAA,OAMX,kBAAA,CAAmB,GAAA;AAAA;AAAA,cASf,aAAA,SAAsB,KAAK;cAC1B,OAAA;AAAA;;;cCzPD,gCAAA,EAAgC,CAAA,CAAA,SAAA;;;;;;;;;KAqBjC,0BAAA,GAA6B,CAAA,CAAE,KAAK,QAAQ,gCAAA;AAAA,cAE3C,gCAAA,EAAgC,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;KAKjC,0BAAA,GAA6B,CAAA,CAAE,KAAK,QAAQ,gCAAA;AAAA,cAQ3C,qCAAA,EAAqC,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;KAOtC,+BAAA,GAAkC,CAAA,CAAE,KAAK,QAAQ,qCAAA;AD1B7D;;;;;AAAA,cCiCa,qCAAA,EAAqC,CAAA,CAAA,SAAA;;;KAGtC,+BAAA,GAAkC,CAAA,CAAE,KAAK,QAAQ,qCAAA;AAAA,cAEhD,kCAAA,EAAkC,CAAA,CAAA,SAAA;;;;KAInC,4BAAA,GAA+B,CAAA,CAAE,KAAK,QAAQ,kCAAA;AAAA,cAE7C,mCAAA,EAAmC,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,SAAA;;;;KACpC,6BAAA,GAAgC,CAAA,CAAE,KAAK,QAAQ,mCAAA;AAAA,cAE9C,kCAAA,EAAkC,CAAA,CAAA,SAAA;;;KACnC,4BAAA,GAA+B,CAAA,CAAE,KAAK,QAAQ,kCAAA;AAAA,cAE7C,mCAAA,EAAmC,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,SAAA;;;KACpC,6BAAA,GAAgC,CAAA,CAAE,KAAK,QAAQ,mCAAA;AAAA,cAE9C,8BAAA,EAA8B,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;KAG/B,wBAAA,GAA2B,CAAA,CAAE,KAAK,QAAQ,8BAAA;AAAA,cAEzC,0BAAA,EAA0B,CAAA,CAAA,SAAA;;;;;;;KAc3B,oBAAA,GAAuB,CAAA,CAAE,KAAK,QAAQ,0BAAA;AAAA,cAErC,8BAAA,EAA8B,CAAA,CAAA,SAAA;;;;;;;;;KAG/B,wBAAA,GAA2B,CAAA,CAAE,KAAK,QAAQ,8BAAA;AAAA,cASzC,wBAAA,EAAwB,CAAA,CAAA,SAAA;;;;;;KAMzB,kBAAA,GAAqB,CAAA,CAAE,KAAK,QAAQ,wBAAA;;;cC9FnC,UAAA;EACJ,KAAA,EAAO,OAAA,GAAQ,OAAA;EAAA,iBACL,UAAA;cAEL,OAAA,EAAS,OAAA,GAAQ,OAAA,EAAc,UAAA;EAKrC,gBAAA,CAAiB,QAAA,UAAkB,IAAA,WAAe,UAAA,YAAsB,OAAA;EAOxE,gBAAA,CAAiB,QAAA,WAAmB,OAAA,CAAQ,eAAA;EAa5C,qBAAA,CAAsB,QAAA,WAAmB,OAAA,CAAQ,kBAAA;EAajD,qBAAA,CAAsB,QAAA,UAAkB,QAAA,EAAU,kBAAA,GAAqB,OAAA;EAKvE,yBAAA,CAA0B,KAAA,UAAe,MAAA,EAAQ,kBAAA,GAAqB,OAAA;EAKtE,wBAAA,CAAyB,KAAA,WAAgB,OAAA;EAIzC,yBAAA,CAA0B,MAAA,aAAmB,OAAA;EAQ7C,6BAAA,CACJ,MAAA,aACC,OAAA,CAAQ,GAAA,SAAY,kBAAA;EAyCjB,yBAAA,CAA0B,GAAA,WAAc,OAAA,CAAQ,gBAAA;EAYhD,0BAAA,CAA2B,GAAA,UAAa,KAAA,EAAO,gBAAA,GAAmB,OAAA;EF7IjD;;;;;EEwJjB,uBAAA,CAAwB,UAAA,UAAoB,KAAA,UAAe,QAAA,UAAkB,GAAA,WAAc,OAAA;EAAA,QAgBzF,kBAAA;EAAA,QAIA,oBAAA;EAAA,QAIA,oBAAA;AAAA;;;UClLO,aAAA;EACf,IAAA,EAAM,CAAC;EACP,QAAA;AAAA;AAAA,UAGe,SAAA;EACf,KAAA,UAAe,GAAA,UAAa,MAAA,eAAqB,OAAA,CAAQ,aAAA,CAAc,CAAA;AAAA;AAAA,UAGxD,YAAA,SAAqB,SAAS;EAC7C,OAAO;AAAA;AAAA,KAGG,MAAA;AAAA,UAEK,iBAAA;EACf,KAAA,EAAO,SAAS;EAEhB,GAAA;AAAA;AAAA,UAGe,aAAA;EACf,GAAA;EACA,MAAA;EACA,SAAA;EACA,KAAA;EACA,OAAA;EACA,UAAA;EACA,OAAA,GAAU,UAAA;EACV,aAAA,GAAgB,iBAAiB;AAAA;AAAA,UAGlB,eAAA;EACf,OAAA,EAAS,aAAA;EACT,kBAAA,GAAqB,aAAA;EACrB,YAAA;EACA,QAAA,GAAW,UAAA;EACX,UAAA,GAAa,YAAA;AAAA;AAAA,UAGE,QAAA;EAAA,SACN,MAAA,EAAQ,MAAA;EAAA,SACR,UAAA,EAAY,UAAA;EACrB,WAAA,EAAa,GAAA,SAAY,GAAA;EACzB,YAAA;EACA,oBAAA,CAAqB,IAAA;IAAQ,KAAA,GAAQ,UAAA;IAAY,QAAA;IAAkB,MAAA;EAAA,IAAuB,OAAA;EAC1F,KAAA,UAAe,GAAA,UAAa,MAAA,eAAqB,OAAA,CAAQ,aAAA,CAAc,CAAA;EACvE,SAAA,IAAa,OAAA,CAAQ,YAAA;EACrB,oBAAA,IAAwB,OAAA,CAAQ,UAAA;EAChC,0BAAA,IAA8B,OAAA;EAC9B,6BAAA,CAA8B,QAAA,WAAmB,OAAA;EACjD,gBAAA,IAAoB,OAAA;EACpB,mBAAA,CAAoB,OAAA,EAAS,SAAA,IAAa,QAAA,EAAU,UAAA,IAAc,QAAA,EAAU,iBAAA,GAAoB,OAAA,CAAQ,eAAA;EACxG,YAAA,CAAa,OAAA,UAAiB,OAAA,EAAS,eAAA,EAAiB,QAAA,WAAmB,OAAA;IAAU,OAAA;EAAA;EACrF,KAAA,IAAS,OAAA;EH3CmB;;;;AAAoC;EGiDhE,qBAAA,CAAsB,EAAA,WAAa,OAAA;EH9ChB;;;;EGmDnB,sBAAA,CAAuB,OAAA,UAAiB,KAAA,UAAe,QAAA,EAAU,UAAA,KAAe,OAAA,CAAQ,cAAA;EHhDrD;;;;;;;EGwDnC,oBAAA,CAAqB,OAAA,UAAiB,SAAA,UAAmB,QAAA,EAAU,UAAA,KAAe,OAAA,CAAQ,cAAA;EHxDhE;;AAAS;AACrC;;;;;;;;AAAiD;AAQjD;;;;;;;EGmEE,wBAAA,CAAyB,QAAA,EAAU,UAAA,IAAc,OAAA,EAAS,SAAA,KAAc,OAAA;AAAA;AAAA,UAGzD,UAAA,SAAmB,QAAA;EAClC,KAAA,IAAS,OAAA;EACT,MAAA,IAAU,OAAA;EACV,QAAA,IAAY,OAAA;EACZ,OAAA;AAAA;AAAA,UAGe,eAAA;EH7Ee;;;;;;EGoF9B,GAAA;;;;;;;EAOA,SAAA;;;;;;EAMA,IAAA;;EAEA,SAAA;AAAA;AAAA,UAGe,UAAA;EACf,WAAA,CAAY,KAAA;EACZ,IAAA,CAAK,GAAA,UAAa,UAAA;EAClB,KAAA,CAAM,GAAA,UAAa,UAAA;EACnB,SAAA,CAAU,GAAA,UAAa,UAAA;;EAEvB,YAAA,CAAa,GAAA,UAAa,UAAA,UAAoB,IAAA,GAAO,eAAA;;EAErD,eAAA,CAAgB,GAAA,UAAa,UAAA,UAAoB,IAAA,GAAO,eAAA;;;;;;;;EAQxD,UAAA,CAAW,GAAA,UAAa,UAAA,UAAoB,IAAA,GAAO,eAAA;;EAEnD,iBAAA,CAAkB,GAAA,UAAa,UAAA,UAAoB,IAAA,GAAO,eAAA;AAAA;AAAA,cAG/C,iBAAA;EACQ,KAAA;cAAA,KAAA;EAGnB,UAAA,CAAW,YAAA,GAAe,KAAA;EAK1B,QAAA;EAIA,QAAA;AAAA;;;UCjKe,WAAA;EACb,MAAA,IAAU,KAAA,EAAO,KAAA,KAAU,OAAA;EAC3B,MAAA,IAAU,KAAA,EAAO,OAAA,KAAY,KAAA;AAAA;AAAA,KAM5B,gBAAA,iBAAiC,WAAA,YAAuB,WAAA,IACzD,CAAA,eAAgB,OAAA,GACd,OAAA,CAAQ,CAAA,UAAW,GAAA,CAAE,UAAA,GAAa,GAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAA,eAClD,CAAA,eAAgB,UAAA,GAChB,UAAA,CAAW,CAAA,UAAW,GAAA,CAAE,UAAA,GAAa,GAAA,CAAE,KAAA,CAAM,UAAA,CAAW,CAAA;AAAA,KAGlD,YAAA,iBAA6B,WAAA,IAAe,OAAA,gBACvC,OAAA,GAAU,UAAA,IAAc,WAAA,CAAY,gBAAA,CAAiB,OAAA,EAAS,CAAA;AAAA,UAG9D,oBAAA,iBAAqC,WAAA,GAAc,WAAA;EAChE,MAAA,GAAS,YAAA,CAAa,OAAA;AAAA;AAAA,UAGT,mBAAA;EAAA,CACZ,GAAW;AAAA;AAAA,UAGC,gBAAA;EACb,IAAA;EACA,OAAA;EACA,MAAA;EACA,IAAA;EACA,KAAA;EACA,KAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,KAGQ,eAAA,YAA2B,gBAAgB;AAAA,UAEtC,kBAAA,iBAAmC,WAAA;EAChD,IAAA;EACA,MAAA,EAAQ,OAAA;EACR,OAAA,GAAU,oBAAA,CAAqB,OAAA;EAC/B,OAAA,GAAU,mBAAA;EACV,OAAA,GAAU,eAAA;AAAA;AAAA,KAQT,aAAA,uBACA,MAAA,wBAA8B,SAAA,GAC7B,MAAA;EAAiB,MAAA,MAAY,IAAA;AAAA,IAAmC,QAAA,GAChE,MAAA,SAAe,WAAA,yBAAoC,KAAA,GACnD,SAAA;AAAA,KAED,SAAA,UACA,IAAA,kCACC,IAAA,SAAa,GAAA,CAAE,UAAA,GAAa,GAAA,CAAE,KAAA,CAAM,IAAA;AAAA,KAE9B,gBAAA,iBAAiC,aAAA,CAAc,MAAA,EAAQ,SAAA,CAAU,IAAA;AAAA,KACjE,aAAA,mBAAgC,WAAA,CAAY,KAAA,EAAO,OAAA;AAAA,KACnD,aAAA,oBAAiC,WAAA,YAAuB,IAAA,CAAK,IAAA,EAAM,IAAA,YAAgB,IAAA,GAAO,MAAA;AAAA,UACrF,mBAAA,gFAII,GAAA,CAAE,UAAA;EAEnB,KAAA,EAAO,MAAA;EACP,GAAA;EACA,KAAA;EACA,IAAA,GAAO,QAAA;EACP,KAAA;IACI,MAAA,GAAS,KAAA,EAAO,OAAA,KAAY,QAAA;IAC5B,MAAA,IAAU,KAAA,EAAO,QAAA,KAAa,OAAA;EAAA;AAAA;AAAA,KAI1B,aAAA;EACR,KAAA;EACA,GAAA;EACA,KAAA;EACA,KAAA,GAAQ,WAAW;AAAA;AAAA,iBAGP,mBAAA,gFAIK,GAAA,CAAE,UAAA,0BAEnB,MAAA,EAAQ,mBAAA,CAAoB,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,QAAA,IACxD,mBAAA,CAAoB,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,QAAA;AAAA,KAItC,QAAA,oBAA4B,CAAA,GAAI,CAAA,CAAE,CAAA;AAAA,KAEzC,iBAAA,iCACW,KAAA,GAAQ,CAAA,eAAgB,OAAA,GAAU,aAAA,CAAc,OAAA,CAAQ,CAAA,GAAI,KAAA,CAAM,CAAA,KAAM,KAAA,CAAM,CAAA;AAAA,KAOzF,iBAAA,iBACe,WAAA,mBACC,oBAAA,CAAqB,OAAA,KACtC,QAAA;EAAmB,MAAA;AAAA,IACjB,QAAA,CAAS,iBAAA,CAAkB,GAAA,CAAE,KAAA,CAAM,GAAA,CAAE,SAAA,CAAU,OAAA,GAAU,UAAA,IAAc,OAAA,KACvE,QAAA,CAAS,GAAA,CAAE,KAAA,CAAM,GAAA,CAAE,SAAA,CAAU,OAAA,GAAU,UAAA;AAAA,KAGxC,eAAA,MACD,CAAA,SAAU,GAAA,CAAE,WAAA,eACZ,CAAA,SAAU,GAAA,CAAE,WAAA,eACZ,CAAA,SAAU,GAAA,CAAE,UAAA;AAAA,KAIX,YAAA,cAA0B,WAAA,kBACf,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,CAAA,kBAAmB,CAAA,iBACvD,IAAA;AAAA,KAEH,YAAA,cAA0B,WAAA,kBACf,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,CAAA,0BAA2B,CAAA,SAC/D,IAAA;AAAA,KAGH,UAAA;EACD,EAAA,EAAI,GAAA,CAAE,SAAA;EACN,QAAA,EAAU,GAAA,CAAE,gBAAgB;AAAA;AAAA,cAGnB,cAAA,EAAc,GAAA,SAAA,gBAAA;AAAA,YAChB,iBAAA;AAAA,iBAEK,WAAA;AAAA,iBAqCA,YAAA,iBACI,WAAA,yCAEC,oBAAA,CAAqB,OAAA,IAAW,oBAAA,CAAqB,OAAA,GAEtE,MAAA,EAAQ,kBAAA,CAAmB,OAAA;EAAa,IAAA,EAAM,KAAA;EAAO,OAAA,GAAU,QAAA;AAAA,IAChE,gBAAA,CAAiB,KAAA,EAAO,QAAA,CAAS,OAAA,GAAU,UAAA,GAAa,iBAAA,CAAkB,OAAA,EAAS,QAAA;AAAA,iBAgEtE,aAAA,CAAc,SAAA,WAAoB,UAAU;AAAA,UAS3C,0BAAA;EACb,MAAA,GAAS,MAAM,SAAS,WAAA;AAAA;AAAA,UAGX,gBAAA,qCAEA,WAAA,UACL,GAAA,CAAE,KAAA,CAAM,GAAA,CAAE,SAAA,CAAU,IAAA;EAE5B,OAAA,EAAS,UAAA;EACT,KAAA,EAAO,MAAA;EACP,MAAA,EAAQ,GAAA,CAAE,SAAA,CAAU,IAAA;EACpB,cAAA,EAAgB,0BAAA;EAChB,OAAA,EAAS,MAAA;EACT,OAAA,EAAS,eAAA;EACT,SAAA,GAAY,KAAA;AAAA;AAAA,KAGJ,WAAA,WAAsB,gBAAA,SAAyB,WAAA,UACvD,CAAA,SAAU,gBAAA,SAAyB,WAAA,iBAA4B,KAAA;AAAA,KAEvD,UAAA,WAAqB,gBAAA,SAAyB,WAAA,UACtD,CAAA,SAAU,gBAAA,4CAEA,YAAA,CAAa,IAAA,KAAS,CAAA,qCAAsC,CAAA,GAClE,OAAA,CAAQ,CAAA,wBAAyB,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAA,+BAEjD,YAAA,CAAa,IAAA,KAAS,CAAA,qCAAsC,CAAA,IAClE,OAAA,CAAQ,CAAA,wBAAyB,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAA;AAAA,UAI9C,KAAA;EACb,KAAA;EACA,OAAA,EAAS,UAAA;EACT,OAAA,EAAS,MAAA;EACT,cAAA,EAAgB,MAAA;EAChB,KAAA,EAAO,MAAA;EACP,MAAA,EAAQ,MAAA,SAAe,WAAA;AAAA;AAAA,KAItB,YAAA,MAAkB,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,KAEvB,eAAA,0BACiB,IAAA,YAAgB,YAAA,CAAa,eAAA,UAEtD,OAAA,CAAQ,UAAA,CAAW,YAAA,WAAuB,eAAA,YACxC,CAAA;AAAA,KAGM,WAAA,sBAAiC,IAAA,mBACzC,OAAA,CAAQ,UAAA,CAAW,QAAA;AAAA,KAEX,SAAA,sBAA+B,IAAA,mBACvC,UAAU,CAAC,QAAA;AAAA,KAEH,YAAA,yBAAqC,IAAA,mBAC7C,UAAU,CAAC,WAAA;AAAA,KAEH,UAAA,uBAAiC,IAAA,mBACzC,UAAU,CAAC,SAAA;;;KCpTV,UAAA,WAAqB,gBAAA,SAAyB,WAAA,QAC/C,CAAA,eAAgB,WAAA,CAAY,CAAA,IAAK,WAAA,CAAY,CAAA,EAAG,CAAA;AAAA,KAE/C,cAAA,8BAA4C,IAAI;AAAA,KAIhD,eAAA,WAA0B,gBAAA,SAAyB,WAAA,mBACxC,WAAA,CAAY,CAAA,IAAK,WAAA,CAAY,WAAA,CAAY,CAAA,EAAG,CAAA,oBAAqB,CAAA,iBACzE,WAAA,CAAY,CAAA;AAAA,KAGf,kBAAA,WAA6B,gBAAA,SAAyB,WAAA,mBAC3C,WAAA,CAAY,CAAA,IAAK,WAAA,CAAY,WAAA,CAAY,CAAA,EAAG,CAAA,WAAY,cAAA,GAAiB,CAAA,iBACjF,WAAA,CAAY,CAAA;AAAA,KAKf,aAAA,WAAwB,gBAAA,SAAyB,WAAA,mBACtC,WAAA,CAAY,CAAA,IACpB,WAAA,CAAY,WAAA,CAAY,CAAA,EAAG,CAAA,WAAY,cAAA,WACvC,WAAA,CAAY,WAAA,CAAY,CAAA,EAAG,CAAA,6BAC3B,WAAA,CAAY,WAAA,CAAY,CAAA,EAAG,CAAA,kCAAmC,CAAA,mBAC9C,WAAA,CAAY,WAAA,CAAY,CAAA,EAAG,CAAA,KAAM,CAAA,iBAEjD,WAAA,CAAY,CAAA;AAAA,UAEH,aAAA;ELtCQ;;;;;;EK6CrB,GAAG;AAAA;AAAA,UAGU,mBAAA,SAA4B,aAAa;ELhDjC;AAEzB;;;;EKoDI,IAAA;ELpD8B;;;;EKyD9B,OAAA;AAAA;AAAA,UAGa,sBAAA,SAA+B,aAAa;;EAEzD,IAAI;AAAA;AAAA,cA8BK,YAAA,WAAuB,gBAAA,SAAyB,WAAA;EAAA,UAE3C,GAAA,EAAK,SAAA;EAAA,UACL,KAAA,EAAO,KAAA;cADP,GAAA,EAAK,SAAA,EACL,KAAA,EAAO,KAAA;EAAA,UAGX,aAAA,CAAc,GAAA;EAIxB,MAAA,IAAU,kBAAA,CAAmB,CAAA,QAAS,WAAA,CAAY,CAAA;EAClD,MAAA,iBAAuB,WAAA,CAAY,CAAA,MAAO,OAAA,EAAS,CAAA,KAAM,kBAAA,CAAmB,CAAA,EAAG,CAAA;AAAA;AAAA,KAOvE,aAAA;EAAkB,EAAA;EAAY,QAAQ;AAAA;AAAA,KAK7C,SAAA,WACS,gBAAA,SAAyB,WAAA,mBACnB,WAAA,CAAY,CAAA,aAClB,MAAA,qBACV,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,CAAA,GAAI,OAAA,CAAQ,CAAA,4BAA6B,WAAA,CAAY,CAAA,MAAO,CAAA;AAAA,cAEpF,kBAAA,WACQ,gBAAA,SAAyB,WAAA,mBACnB,WAAA,CAAY,CAAA,qBAClB,MAAA;EAAA,QAWE,GAAA;EAAA,QACA,KAAA;EAAA,QAVJ,OAAA;EAAA,QACA,aAAA;EAAA,QACA,QAAA;EAAA,QACA,SAAA;EAAA,QACA,aAAA;EAAA,QACA,cAAA;EAAA,QACA,UAAA;cAGI,GAAA,EAAK,SAAA,EACL,KAAA,EAAO,KAAA,EACf,OAAA,KAAW,EAAA,EAAI,aAAA,CAAc,CAAA,eAC7B,aAAA,kBACA,QAAA,kBACA,SAAA,kBACA,aAAA,UAAsB,WAAA,CAAY,CAAA,MAClC,cAAA,GAAgB,aAAA,IAChB,UAAA;EAAA,QAWI,aAAA;EAAA,QAIA,eAAA;EAAA,QAIA,cAAA;EAUR,KAAA,CAAM,QAAA,GAAW,EAAA,EAAI,aAAA,CAAc,CAAA,aAAc,kBAAA,CAAmB,CAAA,EAAG,CAAA,EAAG,CAAA;EAK1E,OAAA,CACI,MAAA,QAAc,WAAA,CAAY,CAAA,UAAW,CAAA,EACrC,SAAA,oBACD,kBAAA,CAAmB,CAAA,EAAG,CAAA,EAAG,CAAA;EAK5B,KAAA,CAAM,CAAA,WAAY,kBAAA,CAAmB,CAAA,EAAG,CAAA,EAAG,CAAA;EAK3C,MAAA,CAAO,CAAA,WAAY,kBAAA,CAAmB,CAAA,EAAG,CAAA,EAAG,CAAA;EAI5C,QAAA,yCAEqB,GAAA,CAAE,UAAA,2CACF,KAAA,iBAAsB,KAAA,uBAEvC,MAAA,EAAQ,mBAAA,CAAoB,MAAA,EAAQ,UAAA,CAAW,OAAA,GAAU,UAAA,CAAW,OAAA,MAAa,QAAA;IAC7E,KAAA;MACI,MAAA,EAAQ,OAAA;MACR,MAAA,IAAU,KAAA,EAAO,UAAA,CAAW,OAAA,MAAa,UAAA,CAAW,OAAA;IAAA;EAAA,IAG7D,kBAAA,CAAmB,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,aAAA,CAAc,CAAA,EAAG,MAAA,EAAQ,gBAAA,CAAiB,aAAA,CAAc,UAAA,CAAW,OAAA,GAAU,UAAA,CAAW,OAAA,OAAc,QAAA;EAC3I,QAAA,yCAEqB,GAAA,CAAE,UAAA,0BAEnB,MAAA,EAAQ,mBAAA,CAAoB,MAAA,oBAA0B,QAAA;IAClD,KAAA;EAAA,IAEL,kBAAA,CAAmB,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,aAAA,CAAc,CAAA,EAAG,MAAA,EAAQ,gBAAA,YAA4B,QAAA;EAwB1F,OAAA,CAAQ,KAAA,WAAgB,MAAA,mBAAyB,kBAAA,CAAmB,CAAA,EAAG,CAAA,EAAG,CAAA;EAKpE,KAAA,IAAS,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,CAAA;EAKjC,MAAA,IAAU,OAAA;EAAA,eAID,gBAAA;EAET,KAAA,IAAS,OAAA;EACT,KAAA,WAAgB,GAAA,CAAE,OAAA,EAAS,MAAA,EAAQ,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAE,MAAA,CAAO,CAAA;EAsCxD,IAAA,CAAK,EAAA,WAAa,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,CAAA;EAgD1C,GAAA,IAAO,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,CAAA;EAAA,QAqD7B,cAAA;AAAA;AAAA,cA2BN,aAAA,WAAwB,gBAAA,SAAyB,WAAA;EAAA,QAIvC,OAAA;EAAA,QACA,MAAA;EAJZ,UAAA,EAAY,SAAA;cAGA,OAAA,EAAS,MAAA,kBACT,MAAA,EAAQ,MAAA,SAAe,WAAA;EAAA,QAG3B,GAAA;EAAA,QAMA,eAAA;EAAA,QAcA,aAAA;EAAA,QAIA,MAAA;EAAA,QAMA,UAAA;EAUR,EAAA,iBAAmB,WAAA,CAAY,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,CAAA,IAAK,aAAA,CAAc,CAAA;EAKnF,GAAA,iBAAoB,WAAA,CAAY,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,CAAA,IAAK,aAAA,CAAc,CAAA;EAKpF,EAAA,WAAa,kBAAA,CAAmB,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,CAAA,IAAK,aAAA,CAAc,CAAA;EAKpF,GAAA,WAAc,kBAAA,CAAmB,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,CAAA,IAAK,aAAA,CAAc,CAAA;EAKrF,EAAA,WAAa,kBAAA,CAAmB,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,CAAA,IAAK,aAAA,CAAc,CAAA;EAKpF,GAAA,WAAc,kBAAA,CAAmB,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,CAAA,IAAK,aAAA,CAAc,CAAA;EAKrF,IAAA,WAAe,eAAA,CAAgB,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,OAAA,WAAkB,aAAA,CAAc,CAAA;EAK3E,KAAA,WAAgB,eAAA,CAAgB,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,OAAA,WAAkB,aAAA,CAAc,CAAA;EAK5E,QAAA,WAAmB,eAAA,CAAgB,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,WAAgB,aAAA,CAAc,CAAA;EAK7E,SAAA,WAAoB,eAAA,CAAgB,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,WAAgB,aAAA,CAAc,CAAA;;;;;;;;;EAa9E,YAAA,WAAuB,aAAA,CAAc,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,WAAgB,IAAA,GAAO,mBAAA,GAAsB,aAAA,CAAc,CAAA;;EAM5G,eAAA,WAA0B,aAAA,CAAc,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,WAAgB,IAAA,GAAO,mBAAA,GAAsB,aAAA,CAAc,CAAA;;;;;;;;;;;;;;;;EAoB/G,UAAA,WAAqB,aAAA,CAAc,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,WAAgB,aAAA,CAAc,CAAA;EAC7E,UAAA,WAAqB,aAAA,CAAc,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,aAAkB,aAAA,CAAc,CAAA;EAC/E,UAAA,WAAqB,aAAA,CAAc,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,UAAe,IAAA;IAAQ,GAAA;EAAA,IAAc,aAAA,CAAc,CAAA;EAClG,UAAA,WAAqB,aAAA,CAAc,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,yBAA8B,IAAA,EAAM,sBAAA,GAAyB,aAAA,CAAc,CAAA;EAC1H,UAAA,WAAqB,aAAA,CAAc,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,YAAiB,IAAA,EAAM,sBAAA;IAA2B,GAAA;EAAA,IAAc,aAAA,CAAc,CAAA;;;;;;;EAuC7H,iBAAA,WAA4B,aAAA,CAAc,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,KAAA,WAAgB,IAAA,GAAO,mBAAA,GAAsB,aAAA,CAAc,CAAA;EAKjH,OAAA,WAAkB,kBAAA,CAAmB,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,UAAA,CAAW,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,UAAA,CAAW,CAAA,EAAG,CAAA,IAAK,aAAA,CAAc,CAAA;EAK5G,MAAA,iBAAuB,WAAA,CAAY,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,aAAA,CAAc,CAAA;EAK9D,OAAA,iBAAwB,WAAA,CAAY,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,aAAA,CAAc,CAAA;;;;;;;;ALzjBnE;;;EKwkBI,EAAA,CAAG,QAAA,IAAY,EAAA,EAAI,aAAA,CAAc,CAAA,gBAAiB,aAAA,CAAc,CAAA;AAAA;AAAA,iBAmBpD,iBAAA,CAAkB,SAAA,EAAW,SAAA,EAAW,MAAA,aAAmB,GAAA,EAAK,UAAU;AAAA,iBA+F1E,gBAAA,CAAiB,GAAA,EAAK,MAAA,mBAAyB,SAAA,EAAW,SAAS;AAAA,iBA0GnE,YAAA,CAAa,MAAA,WAAiB,SAAkB;AAAA,iBAmChD,eAAA,CAAgB,GAAA,WAAc,IAAY;AAAA,iBA4C1C,cAAA,CAAe,GAAA,WAAc,IAAY;;;cC55B5C,SAAA;EAAA,SACF,OAAA;EAAA,SACA,EAAA,EAAI,QAAA;EAAA,UACH,OAAA,EAAS,SAAA;EAAA,UACT,QAAA,EAAU,UAAA;EAAA,QACZ,MAAA;EAAA,UAEE,gBAAA,CAAiB,MAAA,EAAQ,gBAAA,SAAyB,WAAA,IAAe,KAAA;cA0C/D,EAAA,EAAI,QAAA,EAAU,OAAA;EAK1B,kBAAA,IAAsB,SAAA;EACtB,mBAAA,IAAuB,UAAA;EAAA,UAEb,gBAAA,CAAiB,KAAA,UAAe,EAAA,WAAa,UAAA;EAAA,UAI7C,iBAAA,CAAkB,KAAA,UAAe,EAAA,WAAa,UAAA;EAAA,UAI9C,eAAA,CAAgB,KAAA,EAAO,KAAA,EAAO,QAAA,UAAkB,KAAA;AAAA;AAAA,cAO/C,QAAA,SAAiB,SAAA;EAC5B,KAAA,WAAgB,gBAAA,SAAyB,WAAA,GAAc,MAAA,EAAQ,CAAA,GAAI,YAAA,CAAa,CAAA;AAAA;AAAA,cAMrE,QAAA,SAAiB,QAAA;EACtB,MAAA,WAAiB,gBAAA,SAAyB,WAAA,sBAC9C,MAAA,EAAQ,CAAA,EACR,EAAA,EAAI,EAAA,EACJ,IAAA,EAAM,UAAA,CAAW,CAAA,IAChB,OAAA;EA2CG,MAAA,WAAiB,gBAAA,SAAyB,WAAA,sBAC9C,MAAA,EAAQ,CAAA,EACR,EAAA,EAAI,EAAA,EACJ,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,CAAA,yBAC9B,OAAA;EAmBG,MAAA,WAAiB,gBAAA,SAAyB,WAAA,sBAC9C,MAAA,EAAQ,CAAA,EACR,EAAA,EAAI,EAAA,GACH,OAAA;AAAA;;;;;;;;AN7JL;UOMiB,eAAA;EAAA,SAKN,KAAA;EAAA,SACA,IAAA,EAAM,KAAA;EAAA,SACN,EAAA,GAAK,GAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,OAAA,KAAY,OAAA,CAAQ,OAAA;AAAA;AAAA,KAK/C,WAAA,GAAc,eAAe;;KAG7B,QAAA,WAAmB,WAAA,IAC7B,CAAA,SAAU,eAAA,sBAAqC,CAAA;;KAGrC,QAAA,WAAmB,WAAA,IAC7B,CAAA,SAAU,eAAA,sBAAqC,CAAA;;;;;;;;;;APxBxB;KOoCb,SAAA,oBAA6B,WAAA,cACjC,CAAA,YAAa,CAAA,WAAY,CAAA;;iBAYjB,gBAAA;;;;;;;;;;;;;;;;;;;;iBA6BA,WAAA,yCACd,IAAA,EAAM,KAAA,EACN,EAAA,GAAK,GAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,OAAA,KAAY,OAAA,CAAQ,OAAA,IAC/C,eAAA,CAAgB,KAAA,EAAO,OAAA,EAAS,OAAA;;;cCxDtB,UAAA;EAAA,SACU,IAAA,EAAM,QAAA;cAAN,IAAA,EAAM,QAAA;EAAA,OAEpB,MAAA,CAAO,MAAA;IAAU,EAAA,EAAI,QAAA;EAAA,IAAa,UAAA;EAAA,UAI/B,aAAA,IAAiB,QAAA,EAAU,UAAA,IAAc,QAAA,EAAU,QAAA;EAIvD,KAAA,IAAS,EAAA,GAAK,GAAA,EAAK,QAAA,KAAa,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;EAMrD,SAAA,IAAa,EAAA,GAAK,GAAA,EAAK,QAAA,KAAa,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,CAAA;EAcpE,QAAA,IACJ,EAAA,GAAK,GAAA,EAAK,QAAA,KAAa,OAAA,CAAQ,CAAA,GAC/B,WAAA,GAAa,WAAA,GACZ,OAAA,CAAQ,cAAA,CAAe,CAAA;AAAA;AAAA,cAoEf,KAAA,GAAS,EAAA,aAAU,OAAA;;;;;;ARjIhC;USMiB,QAAA;;EAEf,EAAA,EAAI,QAAA;ETRc;ESUlB,SAAA,GAAY,QAAQ;AAAA;;;;;UAOL,WAAA;ETfQ;ESiBvB,EAAA,EAAI,QAAA;ETjBmB;ESmBvB,SAAA,GAAY,QAAQ;AAAA;;;;ATnBG;US0BR,SAAA;ETlBf;ESoBA,EAAA,EAAI,UAAA;ET1B4B;ES4BhC,SAAA,GAAY,QAAQ;AAAA;AAAA,KAKV,OAAA,yCACV,GAAA,EAAK,QAAA,CAAS,QAAA,GACd,KAAA,EAAO,MAAA,KACJ,OAAA,CAAQ,OAAA;AAAA,KAED,UAAA,yCACV,GAAA,EAAK,WAAA,CAAY,QAAA,GACjB,KAAA,EAAO,MAAA,KACJ,OAAA,CAAQ,OAAA;AAAA,KAED,QAAA,yCACV,GAAA,EAAK,SAAA,CAAU,QAAA,GACf,KAAA,EAAO,MAAA,KACJ,OAAA,CAAQ,OAAA;;;;;;;;;;;;;;;KAgBD,iBAAA,wCAGN,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,MAAM;AAAA,UAEvB,aAAA;EAAA,SAMN,KAAA;EAAA,SACA,aAAA,EAAe,KAAA;EAAA,SACf,WAAA,EAAa,OAAA,CAAQ,MAAA;EAAA,SACrB,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,QAAA,IAAY,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,QAAA,IAAY,QAAA,CAAS,MAAA,EAAQ,OAAA,EAAS,QAAA;EAAA,SAC3G,QAAA,EAAU,SAAA;AAAA;AAAA,UAGJ,cAAA,mFAIP,aAAA,CAAc,MAAA,EAAQ,OAAA,WAAkB,QAAA,EAAU,SAAA;EAAA,SACjD,aAAA;EAAA,SACA,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,QAAA;EAAA,SAC7B,aAAA,GAAgB,iBAAA,CAAkB,MAAA,EAAQ,QAAA;AAAA;AAAA,UAGpC,iBAAA,mFAIP,aAAA,CAAc,MAAA,EAAQ,OAAA,cAAqB,QAAA,EAAU,SAAA;EAAA,SACpD,aAAA;EAAA,SACA,EAAA,EAAI,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,QAAA;AAAA;AAAA,UAG1B,eAAA,mFAIP,aAAA,CAAc,MAAA,EAAQ,OAAA,YAAmB,QAAA,EAAU,SAAA;EAAA,SAClD,aAAA;EAAA,SACA,EAAA,EAAI,QAAA,CAAS,MAAA,EAAQ,OAAA,EAAS,QAAA;AAAA;AAAA,KAG7B,YAAA,uBACR,cAAA,WAAyB,QAAA,IACzB,iBAAA,WAA4B,QAAA,IAC5B,eAAA,WAA0B,QAAA;AAAA,UAIb,WAAA;ETtGX;ESwGJ,IAAA,EAAM,OAAA,CAAQ,MAAA;ETxGY;ES0G1B,OAAA,EAAS,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,QAAA;ET1GC;ES4GnC,QAAA;ETrGD;;;;ES0GC,aAAA,GAAgB,iBAAA,CAAkB,MAAA,EAAQ,QAAA;AAAA;AAAA,UAG3B,cAAA;ETnHgC;ESqH/C,IAAA,EAAM,OAAA,CAAQ,MAAA;ET3Fd;ES6FA,OAAA,EAAS,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,QAAA;;EAErC,QAAA;AAAA;AAAA,UAGe,YAAA;;EAEf,IAAA,EAAM,OAAA,CAAQ,MAAA;;EAEd,OAAA,EAAS,QAAA,CAAS,MAAA,EAAQ,OAAA,EAAS,QAAA;;EAEnC,QAAA;AAAA;;KAIU,OAAA,MAAa,CAAA,SAAU,aAAa,2BAA2B,CAAA;;KAG/D,QAAA,MAAc,CAAA,SAAU,aAAa,2BAA2B,CAAA;;KAGhE,MAAA,MAAY,CAAA,SAAU,aAAa,8BAA8B,IAAA;;KAGjE,SAAA,MAAe,CAAA,SAAU,aAAa,2BAA2B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6B7D,kBAAA,mFAEZ,MAAA,EAAQ,WAAA,CAAY,MAAA,EAAQ,OAAA,EAAS,QAAA;EAAc,QAAA,GAAW,SAAA;AAAA,MAC7D,cAAA,CAAe,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;ATpJ/C;;iBS6LgB,qBAAA,mFAEZ,MAAA,EAAQ,cAAA,CAAe,MAAA,EAAQ,OAAA,EAAS,QAAA;EAAc,QAAA,GAAW,SAAA;AAAA,MAChE,iBAAA,CAAkB,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,SAAA;;;;AThMY;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;iBS0OgB,mBAAA,mFAEZ,MAAA,EAAQ,YAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,QAAA;EAAc,QAAA,GAAW,SAAA;AAAA,MAC9D,eAAA,CAAgB,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,SAAA;;;;;;;KCxRpC,MAAA,qBAA2B,MAAA,SAAe,YAAA,CAAa,QAAA;EACjE,KAAA;EACA,UAAA,EAAY,WAAA;EACZ,WAAA;AAAA;AVPkB;AAEpB;;;AAFoB,KUcR,SAAA,qBACU,MAAA,SAAe,YAAA,CAAa,QAAA,KAAa,MAAA,SAAe,YAAA,yBAE1E,MAAA,CAAO,WAAA,EAAa,QAAA;;KAKZ,eAAA,WAA0B,MAAA,SAAe,YAAA,mBACvC,CAAA,IAAK,CAAA,CAAE,CAAA;EAAa,aAAA;AAAA,IAA2B,CAAA,WAAY,CAAA,CAAE,CAAA;;KAI/D,kBAAA,WAA6B,MAAA,SAAe,YAAA,mBAC1C,CAAA,IAAK,CAAA,CAAE,CAAA;EAAa,aAAA;AAAA,IAA8B,CAAA,WAAY,CAAA,CAAE,CAAA;AVxB9E;AAAA,KU4BY,gBAAA,WAA2B,MAAA,SAAe,YAAA,mBACxC,CAAA,IAAK,CAAA,CAAE,CAAA;EAAa,aAAA;AAAA,IAA4B,CAAA,WAAY,CAAA,CAAE,CAAA;;KAIhE,gBAAA,WAA2B,MAAA,SAAe,YAAA,KAAiB,IAAA,CACrE,CAAA,gBACc,CAAA,GAAI,CAAA,CAAE,CAAA;EAAa,QAAA;AAAA,YAA2B,CAAA,SAAU,CAAA;;KAI5D,cAAA,WAAyB,MAAA,SACnC,CAAA,SAAU,MAAA,kBAAwB,CAAA;AAAA,KAExB,YAAA;EACV,UAAA,EAAY,CAAC;EACb,WAAA;AAAA;;;;;;;;AVrCF;;;;;;;;iBUuDgB,MAAA,qBAA2B,MAAA,SAAe,YAAA,4BACxD,MAAA,EAAQ,YAAA,CAAa,WAAA,IACpB,MAAA,CAAO,WAAA,EAAa,QAAA;AAAA,UAgBN,mBAAA;EACf,IAAA;EACA,IAAA;EACA,QAAA;EACA,WAAA,EAAa,YAAA,CAAa,QAAA;EAC1B,EAAA,EAAI,YAAA,CAAa,QAAA;EVxEkB;EU0EnC,aAAA,sBAAmC,SAAA,EAAW,QAAA,cAAsB,KAAA;AAAA;AAAA,iBAMtD,kBAAA,CAAmB,SAAA,WAAoB,eAAe;AAAA,cASzD,eAAA;EACX,iBAAA,EAAiB,GAAA,SAAA,mBAAA;EACjB,sBAAA,EAAsB,GAAA;EAEtB,iBAAA,WAA4B,IAAA,UAAc,IAAA,EAAM,YAAA,CAAa,QAAA;EV7FnC;EU0H1B,YAAA,qBAAiC,IAAA,WAAe,mBAAA,CAAoB,QAAA;EV1HjC;EU+HnC,iBAAA;EVxHD;EU6HC,gBAAA,IAAoB,GAAA,SAAY,mBAAA;EVnIK;EUwIrC,aAAA;EAKA,qBAAA,CAAsB,IAAA;EAItB,mBAAA,CAAoB,IAAA;EAIpB,uBAAA;AAAA;;;cCpHW,QAAA,SAAiB,KAAK;EACjC,IAAA;cACY,OAAA,UAAiB,IAAA;AAAA;AAAA,UASd,gBAAA;EX5DQ;;;;AAAA;EWkEvB,kBAAkB;AAAA;AAAA,UAGH,mBAAA;EXnEiB;EWqEhC,MAAA;EXrEgC;EWuEhC,OAAO;AAAA;AAAA,UAGQ,eAAA;;EAEf,GAAA;;EAEA,KAAA,SAAc,OAAA;;EAEd,mBAAA;;EAEA,SAAA;wDAEE,OAAA;IAEA,WAAA;IAEA,KAAA;IAEA,OAAA;EAAA;EXnFuB;EWsFzB,SAAA,GAAY,gBAAA;EXtFuB;;;;;AAA6B;AAGlE;EW2FE,QAAA,GAAW,mBAAA;;EAEX,SAAA;EX3F2B;EW6F3B,YAAA;EX5FmC;EW8FnC,OAAA,IAAW,KAAA,EAAO,KAAA;AAAA;;;;;;;;AX9FiB;KWgKzB,iBAAA;AAAA,cAMC,eAAA;EAAA,QACH,EAAA;EAAA,QACA,OAAA;EAAA,QACA,4BAAA;EAAA,QACA,mBAAA;EAAA,QACA,SAAA;EAAA,QACA,eAAA;EX3KuC;AAQjD;;;;;;;;;;EARiD,QWuLvC,aAAA;EAAA,QACA,WAAA;EAAA,QACA,iBAAA;EAAA,QACA,cAAA;EAAA,QACA,eAAA;EAAA,QACA,SAAA;EXpLsB;;;;;EAAA,QW0LtB,UAAA;EAAA,QACA,gBAAA;EAAA,QACA,cAAA;EAAA,QACA,eAAA;EAAA,QAGA,kBAAA;EAAA,QACA,mBAAA;EAAA,QACA,eAAA;EAAA,QAUA,qBAAA;EAAA,QACA,oBAAA;EAAA,QAUA,cAAA;EAAA,QACA,eAAA;EAAA,QACA,eAAA;EAAA,QACA,UAAA;EAAA,QAGA,kBAAA;EAAA,QACA,cAAA;cAEI,OAAA,EAAS,eAAA;;;;;EA4BrB,OAAA,CAAQ,QAAA,GAAW,CAAA,EAAG,iBAAA;;EAStB,cAAA,IAAkB,iBAAA;;;;;EAQZ,OAAA,IAAW,OAAA;;;;EAiEjB,UAAA;;;;EAmBA,OAAA;;;;EAOA,eAAA;;;;EAOA,YAAA;;;;;;;;EAWA,aAAA;;;;;AXvWF;;;;;;EWqXQ,IAAA,CACJ,SAAA,UACA,KAAA,WACA,OAAA;IAAY,MAAA;EAAA,IACX,OAAA;EXvXQ;;;;;;;EAAA,QWibG,eAAA;;;;;UAmCN,YAAA;EXpdqB;;;;;;;EAAA,QW0erB,gBAAA;;;;;;;;;;;UAwCA,cAAA;;AX9gBV;;;;;;;;AAA4D;AAE5D;EW6kBQ,SAAA,CACJ,SAAA,UACA,KAAA,WACA,eAAA,UACA,QAAA,GAAW,IAAA,oBACX,MAAA,IAAU,MAAA,gCACT,OAAA;IAAU,KAAA;IAAe,WAAA;EAAA;EAAA,QAgIpB,iBAAA;;UAQA,cAAA;;UAQA,aAAA;EAAA,QAMA,qBAAA;EAAA,QA8BM,aAAA;EXvwBc;;;;;EAAA,QWg3BpB,UAAA;EAAA,QAKA,cAAA;EAAA,QAiBA,wBAAA;;;;;;;UAaA,sBAAA;EAAA,QAYA,WAAA;EAAA,QAgDA,WAAA;EAAA,QAgBA,uBAAA;EAAA,QAaA,sBAAA;;;AXx+BV;;;;;;UWu/BU,iBAAA;EAAA,QAsBA,2BAAA;EAAA,QAwCA,0BAAA;EAAA,QAaA,iBAAA;EAAA,QAkCA,kBAAA;EAAA,QAQA,SAAA;EAAA,QAYM,eAAA;EAAA,QAMN,IAAA;EAAA,QAMA,OAAA;EAAA,QAoCA,iBAAA;AAAA;;;UCnuCO,YAAA;EACf,IAAA;EACA,EAAA;EACA,KAAA;EACA,IAAA;AAAA;AAAA,cAMW,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;cAKjB,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;;;cAOjB,sBAAA,EAAsB,CAAA,CAAA,SAAA;;;;;;cAOtB,wBAAA,EAAwB,CAAA,CAAA,SAAA;;;;cAKxB,mBAAA,EAAmB,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;KAQpB,WAAA,GAAc,CAAA,CAAE,KAAK,QAAQ,iBAAA;AAAA,KAC7B,WAAA,GAAc,CAAA,CAAE,KAAK,QAAQ,iBAAA;AAAA,KAC7B,gBAAA,GAAmB,CAAA,CAAE,KAAK,QAAQ,sBAAA;AAAA,KAClC,kBAAA,GAAqB,CAAA,CAAE,KAAK,QAAQ,wBAAA;AAAA,KACpC,aAAA,GAAgB,CAAA,CAAE,KAAK,QAAQ,mBAAA;AAAA,cAI9B,sBAAA,EAAsB,CAAA,CAAA,SAAA;;;;cAKtB,wBAAA,EAAwB,CAAA,CAAA,SAAA;;;;;cAMxB,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;;;cAMvB,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;;;;;;cAkBrB,+BAAA,EAA+B,CAAA,CAAA,SAAA;;;;;;AZjE5C;;;;;;;AAAA,cY+Ea,6BAAA,EAA6B,CAAA,CAAA,SAAA;;;;;;;;;;;;cAa7B,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;cAIvB,mBAAA,EAAmB,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAUpB,gBAAA,GAAmB,CAAA,CAAE,KAAK,QAAQ,sBAAA;AAAA,KAClC,kBAAA,GAAqB,CAAA,CAAE,KAAK,QAAQ,wBAAA;AAAA,KACpC,iBAAA,GAAoB,CAAA,CAAE,KAAK,QAAQ,uBAAA;AAAA,KACnC,eAAA,GAAkB,CAAA,CAAE,KAAK,QAAQ,qBAAA;AAAA,KACjC,yBAAA,GAA4B,CAAA,CAAE,KAAK,QAAQ,+BAAA;AAAA,KAC3C,uBAAA,GAA0B,CAAA,CAAE,KAAK,QAAQ,6BAAA;AAAA,KACzC,iBAAA,GAAoB,CAAA,CAAE,KAAK,QAAQ,uBAAA;AAAA,KACnC,aAAA,GAAgB,CAAA,CAAE,KAAK,QAAQ,mBAAA;AAAA,cAE9B,mBAAA,SAA4B,KAAA;EAG9B,KAAA,EAAO,MAAA;cADd,OAAA,UACO,KAAA,GAAO,MAAA;AAAA;;;;KASN,UAAA,MAAgB,CAAC;EAAW,QAAA;AAAA,KAAuB,CAAA;AAAA,UAE9C,OAAA;EACf,SAAA;;EAEA,IAAA;IACE,MAAA;EAAA;AAAA;;;UCrIa,aAAA;EbhBqD;EakBpE,GAAA;EblBuB;EaoBvB,KAAA,SAAc,OAAA;EbpBS;EasBvB,mBAAA;EbtBuB;EawBvB,SAAA,GAAY,eAAA;EbxBW;;;;;Ea8BvB,SAAA,GAAY,eAAA;Eb9BW;AAEzB;;;;;EamCE,QAAA,GAAW,eAAA;EAEX,SAAA;EACA,YAAA;AAAA;;;;;;;;;;;;;KAeU,eAAA;AAAA,UAOK,cAAA;EACf,IAAA,EAAM,CAAA;EACN,MAAA,EAAQ,eAAA;EACR,KAAA,EAAO,KAAA;AAAA;AAAA,UAGQ,eAAA;Eb3DoB;Ea6DnC,GAAA,IAAO,CAAA;Eb7DuB;Ea+D9B,QAAA,IAAY,cAAA,CAAe,CAAA;Eb/DqC;AAAA;AAGlE;;;;;EaoEE,OAAA,CAAQ,QAAA;EbjE2B;EamEnC,MAAA,CAAO,QAAA,GAAW,IAAA,EAAM,CAAA;EbrEtB;EauEF,OAAA;EbtEiB;EawEjB,WAAA;AAAA;;;AbtE+C;iBa2FjC,YAAA,mBACI,MAAA,CAAO,MAAA,SAAe,YAAA,CAAa,QAAA,IAAY,QAAA,2CAE7C,MAAA,SAAe,YAAA,CAAa,QAAA,KAAa,SAAA,gBAC7D,OAAA,EAAS,aAAA,GAAgB,oBAAA,CAAqB,WAAA,EAAa,QAAA,IAAY,eAAA;;;;UAgVxD,eAAA;;EAEf,OAAA,IAAW,OAAA;;EAEX,UAAA;;EAEA,OAAA;;EAEA,eAAA;;EAEA,YAAA;;;;;;;EAOA,aAAA;;EAEA,OAAA,CAAQ,QAAA,GAAW,CAAA,EAAG,iBAAA;;EAEtB,cAAA,IAAkB,iBAAA;AAAA;;;;;;KAQR,oBAAA,qBACU,MAAA,SAAe,YAAA,CAAa,QAAA,wCAGlC,WAAA,IAAe,UAAA,CAAW,WAAA,CAAY,CAAA,0BAA2B,CAAA,GAC7E,WAAA,CAAY,CAAA;EAAa,aAAA;AAAA;EAEvB,KAAA,GAAQ,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,CAAA,OAAQ,OAAA,CAAQ,QAAA,CAAS,WAAA,CAAY,CAAA;EACxE,SAAA,GAAY,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,CAAA,OAAQ,eAAA,CAAgB,QAAA,CAAS,WAAA,CAAY,CAAA;AAAA,IAEpF,WAAA,CAAY,CAAA;EAAa,aAAA;AAAA;EACvB,MAAA,GAAS,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,CAAA,IAAK,IAAA,GAAO,WAAA,KAAgB,OAAA,CAAQ,QAAA,CAAS,WAAA,CAAY,CAAA;AAAA,IAC/F,WAAA,CAAY,CAAA;EAAa,aAAA;AAAA;EACvB,MAAA,GAAS,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,CAAA,IAAK,IAAA,GAAO,WAAA,KAAgB,OAAA,CAAQ,QAAA,CAAS,WAAA,CAAY,CAAA;AAAA;;;;UAOpF,WAAA;;;;;;;;EAQf,MAAM;AAAA;;;UCzfS,aAAA;EACb,UAAA;EACA,SAAA;AAAA;;;AdHgB;AAEpB;;;iBcUgB,YAAA,mBACM,MAAA,CAAO,MAAA,SAAe,YAAA,CAAa,QAAA,IAAY,QAAA,2CAE7C,MAAA,SAAe,YAAA,CAAa,QAAA,KAAa,SAAA,gBAC/D,OAAA,EAAS,aAAA,QAAqB,oBAAA,CAAqB,WAAA,EAAa,QAAA;;;;;KA+FtD,oBAAA,qBAAyC,MAAA,SAAe,YAAA,CAAa,QAAA,wCACjE,WAAA,GAAc,WAAA,CAAY,CAAA;EAAa,aAAA;AAAA;EAE/C,KAAA,GAAQ,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,CAAA,IAAK,SAAA,EAAW,QAAA,KAAa,OAAA,CAAQ,QAAA,CAAS,WAAA,CAAY,CAAA;EAC7F,SAAA,GAAY,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,CAAA,IAAK,SAAA,EAAW,QAAA,KAAa,OAAA,CAAQ,UAAA,CAAW,QAAA,CAAS,WAAA,CAAY,CAAA;AAAA,IAE9G,WAAA,CAAY,CAAA;EAAa,aAAA;AAAA;EACvB,MAAA,GAAS,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,CAAA,IAAK,SAAA,EAAW,QAAA,KAAa,OAAA,CAAQ,QAAA,CAAS,WAAA,CAAY,CAAA;AAAA,IAChG,WAAA,CAAY,CAAA;EAAa,aAAA;AAAA;EACvB,MAAA,GAAS,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,CAAA,IAAK,SAAA,EAAW,QAAA,KAAa,OAAA,CAAQ,QAAA,CAAS,WAAA,CAAY,CAAA;AAAA;EAGlG,IAAA,GAAO,MAAA;IAAU,EAAA,EAAI,UAAA;EAAA,MAAiB,OAAA;AAAA;;;;KAM9B,gBAAA,iBAAiC,MAAA,cAAoB,oBAAA,CAAqB,OAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { An as CacheLayer, Cn as DbType, En as PreparedQueries, On as SqlBuilder, Or as ReadEntry, Sn as DbQueryResult, Tn as PooledClient, Zn as CommitLogEntry, jr as WriteEntry, kn as TxDatabase, wn as LazyCommitTsParam, xn as Database } from "./index-DouKwYL6.js";
|
|
2
2
|
import { Pool, PoolOptions } from "mysql2/promise";
|
|
3
3
|
import { Logger } from "pino";
|
|
4
4
|
|
|
@@ -101,4 +101,4 @@ declare class MySqlDatabase implements Database {
|
|
|
101
101
|
}
|
|
102
102
|
//#endregion
|
|
103
103
|
export { MySqlDatabase as t };
|
|
104
|
-
//# sourceMappingURL=mysql-
|
|
104
|
+
//# sourceMappingURL=mysql-Bxurg_PH.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-
|
|
1
|
+
{"version":3,"file":"mysql-Bxurg_PH.d.ts","names":[],"sources":["../src/db/mysql.ts"],"mappings":";;;;;;;;;KAwCY,gBAAA,GAAmB,WAAW;EAAK,cAAc;AAAA;AAAA,cAEhD,aAAA,YAAyB,QAAA;cAElC,MAAA,EAAQ,MAAA,EACR,MAAA,EAAQ,gBAAA,EACR,IAAA,GAAM,IAAA;EAAA,QAaA,MAAA;EACD,MAAA,EAAQ,WAAA;EAAA,UACL,cAAA;EAAA,QACF,IAAA;EAAA,SACC,MAAA,EAAQ,MAAA;EAAA,SACR,UAAA,EAAY,UAAA;EAMd,WAAA,EAAa,GAAA,SAAY,GAAA;EAAA,UAGtB,QAAA,EAAU,GAAA;EAgK6D;;;;;;EAxJ3E,wBAAA,CAAyB,KAAA,WAAgB,OAAA,CAAQ,GAAA;EAkLnB;;;;;;EA1JpC,cAAA,CAAe,KAAA,WAAgB,GAAA;EA4PnB;;;;;;;;;;;;;;;EApON,oBAAA,CAAqB,IAAA;IACzB,KAAA,GAAQ,UAAA;IACR,QAAA;IACA,MAAA;EAAA,IACE,OAAA;EAzFF;;;;;EAmIF,qBAAA,CAAsB,KAAA;EAnHf;;;EAkIP,WAAA,CACE,WAAA,EAAa,GAAA,SAAY,GAAA,mBACzB,QAAA,EAAU,GAAA;EAjIH;;EAAA,QAyIK,cAAA;EASd,YAAA;EAwBM,KAAA,UAAe,GAAA,UAAa,MAAA,eAAyB,OAAA,CAAQ,aAAA,CAAc,CAAA;EAc3E,SAAA,IAAa,OAAA,CAAQ,YAAA;EAKrB,oBAAA,IAAwB,OAAA,CAAQ,UAAA;EAOhC,0BAAA,IAA8B,OAAA;EAK9B,6BAAA,CAA8B,QAAA,WAAmB,OAAA;EAOjD,gBAAA,IAAoB,OAAA;EAuBpB,wBAAA,CAAyB,QAAA,EAAU,UAAA,IAAc,OAAA,EAAS,SAAA,KAAc,OAAA;EA6DxE,mBAAA,CACJ,OAAA,EAAS,SAAA,IACT,QAAA,EAAU,UAAA,IACV,QAAA,EAAU,iBAAA,GACT,OAAA,CAAQ,eAAA;EAAA,QAmBG,uBAAA;EAAA,QAyBA,uBAAA;EAAA,QA2CA,wBAAA;EAAA,QAiCA,uBAAA;EAAA,QA4BA,sBAAA;EAzXZ;;;;;;;EAAA,QAmaM,wCAAA;EAgDF,YAAA,CACJ,OAAA,UACA,OAAA,EAAS,eAAA,EACT,QAAA,WACC,OAAA;IAAU,OAAA;EAAA;EAAA,QAqCC,gBAAA;EAAA,QAyDA,4BAAA;EAwCR,qBAAA,CAAsB,EAAA,WAAa,OAAA;EAQnC,sBAAA,CAAuB,OAAA,UAAiB,KAAA,UAAe,QAAA,EAAU,UAAA,KAAe,OAAA,CAAQ,cAAA;EAmBxF,oBAAA,CAAqB,OAAA,UAAiB,SAAA,UAAmB,QAAA,EAAU,UAAA,KAAe,OAAA,CAAQ,cAAA;EAmB1F,KAAA,IAAS,OAAA;AAAA"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { An as CacheLayer, Cn as DbType, En as PreparedQueries, On as SqlBuilder, Or as ReadEntry, Sn as DbQueryResult, Tn as PooledClient, Zn as CommitLogEntry, jr as WriteEntry, kn as TxDatabase, wn as LazyCommitTsParam, xn as Database } from "./index-CaWMDqq0.js";
|
|
2
|
+
import { Pool, PoolOptions } from "mysql2/promise";
|
|
3
|
+
import { Logger } from "pino";
|
|
4
|
+
|
|
5
|
+
//#region src/db/mysql.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* mysql2's PoolOptions does not have a per-statement timeout field; we
|
|
8
|
+
* carry our own. Set 0 to disable.
|
|
9
|
+
*/
|
|
10
|
+
type MySqlPoolOptions = PoolOptions & {
|
|
11
|
+
queryTimeoutMs?: number;
|
|
12
|
+
};
|
|
13
|
+
declare class MySqlDatabase implements Database {
|
|
14
|
+
constructor(logger: Logger, config: MySqlPoolOptions, pool?: Pool | undefined);
|
|
15
|
+
private logger;
|
|
16
|
+
config: PoolOptions;
|
|
17
|
+
protected queryTimeoutMs: number;
|
|
18
|
+
private pool;
|
|
19
|
+
readonly dbType: DbType;
|
|
20
|
+
readonly sqlBuilder: SqlBuilder;
|
|
21
|
+
columnTypes: Map<string, Map<string, string>>;
|
|
22
|
+
protected sqlCache: Map<string, string>;
|
|
23
|
+
/**
|
|
24
|
+
* Fetches actual column types from MySQL for `table` and returns a
|
|
25
|
+
* map of DB column name → MySQL type string (as produced by `COLUMN_TYPE`,
|
|
26
|
+
* e.g. `bigint`, `integer`, `varchar(32)`, `text`, `json`).
|
|
27
|
+
* No caching here — see {@link getColumnTypes} for the cached path.
|
|
28
|
+
*/
|
|
29
|
+
loadColumnTypesFromMySql(table: string): Promise<Map<string, string>>;
|
|
30
|
+
/**
|
|
31
|
+
* Synchronous column-type lookup. The apply path calls this on every
|
|
32
|
+
* batched write, so it can't await — populate the cache via
|
|
33
|
+
* {@link bootstrapColumnTypes} at server start. Throws if `table` is
|
|
34
|
+
* missing (programmer error / bootstrap skipped).
|
|
35
|
+
*/
|
|
36
|
+
getColumnTypes(table: string): Map<string, string> | null;
|
|
37
|
+
/**
|
|
38
|
+
* Eagerly load column types into the in-memory cache. With a Redis
|
|
39
|
+
* client supplied, attempts the cache key first and falls through to
|
|
40
|
+
* MySQL on miss (writing the result back to Redis). This is the
|
|
41
|
+
* "one server queries MySQL, the rest read from Redis" pattern for cold
|
|
42
|
+
* starts in a multi-instance deploy. Without Redis, always queries MySQL.
|
|
43
|
+
*
|
|
44
|
+
* Pass `tables` to limit the load to a specific list; otherwise every
|
|
45
|
+
* user table in the connected database is loaded.
|
|
46
|
+
*
|
|
47
|
+
* The Redis cache key should encode whatever invalidates types in your
|
|
48
|
+
* environment (typically a schema version / deploy version). The
|
|
49
|
+
* subscriber in supalive-server.ts is expected to publish a reload
|
|
50
|
+
* signal after migrations and invoke {@link invalidateColumnTypes}.
|
|
51
|
+
*/
|
|
52
|
+
bootstrapColumnTypes(opts: {
|
|
53
|
+
redis?: CacheLayer;
|
|
54
|
+
cacheKey: string;
|
|
55
|
+
tables?: string[];
|
|
56
|
+
}): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Invalidate cached types (and dependent SQL) for `table`, or the entire
|
|
59
|
+
* cache if `table` is omitted. The Redis-pubsub reload signal in
|
|
60
|
+
* supalive-server.ts is expected to call this on schema changes.
|
|
61
|
+
*/
|
|
62
|
+
invalidateColumnTypes(table?: string): void;
|
|
63
|
+
/** Replace this instance's caches with shared references from a parent.
|
|
64
|
+
* Used by getTransactionClient so types loaded once at startup are
|
|
65
|
+
* visible inside transactions. */
|
|
66
|
+
adoptCaches(columnTypes: Map<string, Map<string, string>>, sqlCache: Map<string, string>): void;
|
|
67
|
+
/** Enumerate the user-defined tables in the connected database for mysql — used
|
|
68
|
+
* by bootstrapColumnTypes() when no explicit list is provided. */
|
|
69
|
+
private listUserTables;
|
|
70
|
+
migrationSql: string[];
|
|
71
|
+
query<T = any>(sql: string, params?: unknown[]): Promise<DbQueryResult<T>>;
|
|
72
|
+
getClient(): Promise<PooledClient>;
|
|
73
|
+
getTransactionClient(): Promise<TxDatabase>;
|
|
74
|
+
getLatestSnapshotTimestamp(): Promise<bigint>;
|
|
75
|
+
updateLatestSnapshotTimestamp(commitTs: bigint): Promise<void>;
|
|
76
|
+
getNextTimestamp(): Promise<bigint>;
|
|
77
|
+
attachPrevDataToWriteSet(writeSet: WriteEntry[], readSet: ReadEntry[]): Promise<void>;
|
|
78
|
+
prepareCommitWrites(readSet: ReadEntry[], writeSet: WriteEntry[], commitTs: LazyCommitTsParam): Promise<PreparedQueries>;
|
|
79
|
+
private mysqlPrepareBatchWrites;
|
|
80
|
+
private mysqlPrepareInsertBatch;
|
|
81
|
+
private mysqlPrepareUpdateSingle;
|
|
82
|
+
private mysqlPrepareDeleteBatch;
|
|
83
|
+
private mysqlPrepareCommitLogs;
|
|
84
|
+
/**
|
|
85
|
+
* Point-only OCC check. For each genuine point read, compare the row's
|
|
86
|
+
* current commit_ts against the value captured at read time. A `null`
|
|
87
|
+
* expectedCommitTs means "row didn't exist when we read"; any row found
|
|
88
|
+
* now is a conflict. Reads whose row is being written in this same txn
|
|
89
|
+
* are skipped — the CAS UPDATE/DELETE already validated those.
|
|
90
|
+
*/
|
|
91
|
+
private mysqlPrepareValidatePointReadsByCommitTs;
|
|
92
|
+
commitWrites(beginTs: bigint, queries: PreparedQueries, commitTs: bigint): Promise<{
|
|
93
|
+
success: boolean;
|
|
94
|
+
}>;
|
|
95
|
+
private mysqlApplyWrites;
|
|
96
|
+
private validatePointReadsByCommitTs;
|
|
97
|
+
pruneCommitLogsBefore(ts: bigint): Promise<bigint>;
|
|
98
|
+
getCommitLogsBetweenTs(beginTs: bigint, endTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]>;
|
|
99
|
+
getCommitLogsSinceTs(sinceTs: bigint, excludeTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]>;
|
|
100
|
+
close(): Promise<void>;
|
|
101
|
+
}
|
|
102
|
+
//#endregion
|
|
103
|
+
export { MySqlDatabase as t };
|
|
104
|
+
//# sourceMappingURL=mysql-Cxd4Uq5p.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-Cxd4Uq5p.d.ts","names":[],"sources":["../src/db/mysql.ts"],"mappings":";;;;;;;;;KAwCY,gBAAA,GAAmB,WAAW;EAAK,cAAc;AAAA;AAAA,cAEhD,aAAA,YAAyB,QAAA;cAElC,MAAA,EAAQ,MAAA,EACR,MAAA,EAAQ,gBAAA,EACR,IAAA,GAAM,IAAA;EAAA,QAaA,MAAA;EACD,MAAA,EAAQ,WAAA;EAAA,UACL,cAAA;EAAA,QACF,IAAA;EAAA,SACC,MAAA,EAAQ,MAAA;EAAA,SACR,UAAA,EAAY,UAAA;EAMd,WAAA,EAAa,GAAA,SAAY,GAAA;EAAA,UAGtB,QAAA,EAAU,GAAA;EAgK6D;;;;;;EAxJ3E,wBAAA,CAAyB,KAAA,WAAgB,OAAA,CAAQ,GAAA;EAkLnB;;;;;;EA1JpC,cAAA,CAAe,KAAA,WAAgB,GAAA;EA4PnB;;;;;;;;;;;;;;;EApON,oBAAA,CAAqB,IAAA;IACzB,KAAA,GAAQ,UAAA;IACR,QAAA;IACA,MAAA;EAAA,IACE,OAAA;EAzFF;;;;;EAmIF,qBAAA,CAAsB,KAAA;EAnHf;;;EAkIP,WAAA,CACE,WAAA,EAAa,GAAA,SAAY,GAAA,mBACzB,QAAA,EAAU,GAAA;EAjIH;;EAAA,QAyIK,cAAA;EASd,YAAA;EAwBM,KAAA,UAAe,GAAA,UAAa,MAAA,eAAyB,OAAA,CAAQ,aAAA,CAAc,CAAA;EAc3E,SAAA,IAAa,OAAA,CAAQ,YAAA;EAKrB,oBAAA,IAAwB,OAAA,CAAQ,UAAA;EAOhC,0BAAA,IAA8B,OAAA;EAK9B,6BAAA,CAA8B,QAAA,WAAmB,OAAA;EAOjD,gBAAA,IAAoB,OAAA;EAuBpB,wBAAA,CAAyB,QAAA,EAAU,UAAA,IAAc,OAAA,EAAS,SAAA,KAAc,OAAA;EA6DxE,mBAAA,CACJ,OAAA,EAAS,SAAA,IACT,QAAA,EAAU,UAAA,IACV,QAAA,EAAU,iBAAA,GACT,OAAA,CAAQ,eAAA;EAAA,QAmBG,uBAAA;EAAA,QAyBA,uBAAA;EAAA,QA2CA,wBAAA;EAAA,QAiCA,uBAAA;EAAA,QA4BA,sBAAA;EAzXZ;;;;;;;EAAA,QAmaM,wCAAA;EAgDF,YAAA,CACJ,OAAA,UACA,OAAA,EAAS,eAAA,EACT,QAAA,WACC,OAAA;IAAU,OAAA;EAAA;EAAA,QAqCC,gBAAA;EAAA,QAyDA,4BAAA;EAwCR,qBAAA,CAAsB,EAAA,WAAa,OAAA;EAQnC,sBAAA,CAAuB,OAAA,UAAiB,KAAA,UAAe,QAAA,EAAU,UAAA,KAAe,OAAA,CAAQ,cAAA;EAmBxF,oBAAA,CAAqB,OAAA,UAAiB,SAAA,UAAmB,QAAA,EAAU,UAAA,KAAe,OAAA,CAAQ,cAAA;EAmB1F,KAAA,IAAS,OAAA;AAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { r as utf8Encode } from "./bytes-AuEkyxeU.js";
|
|
2
|
+
import { r as supaliveStringify } from "./helper-wGbzz6zo.js";
|
|
3
|
+
import { C as normalizeIdToBytes, l as OccConflictError, w as normalizeToBytes } from "./types_db-DXj_l9n-.js";
|
|
4
|
+
import { r as mapReadSetToRaw, t as checkLogsAffectReadSet } from "./overlap-checker-Ct_HP_iB.js";
|
|
4
5
|
import mysql from "mysql2/promise";
|
|
5
6
|
//#region src/db/mysql.ts
|
|
6
7
|
function toBufferView(bytes) {
|
|
@@ -566,4 +567,4 @@ const mysqlSql = {
|
|
|
566
567
|
//#endregion
|
|
567
568
|
export { MySqlDatabase as t };
|
|
568
569
|
|
|
569
|
-
//# sourceMappingURL=mysql-
|
|
570
|
+
//# sourceMappingURL=mysql-bvnjYWvZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-DELSRrpY.js","names":[],"sources":["../src/db/mysql.ts"],"sourcesContent":["import mysql, { Pool, PoolConnection, PoolOptions } from \"mysql2/promise\";\nimport { Database, DbQueryResult, DbType, LazyCommitTsParam, PendingPointEntry, PooledClient, PreparedQueries, PreparedQuery, SqlBuilder, TxDatabase } from \"./db\";\nimport { CommitLogEntry, normalizeIdToBytes, normalizeToBytes, OccConflictError, PointRead, ReadEntry, WriteEntry } from \"./types_db\";\nimport { utf8Encode } from \"./bytes\";\n\n// mysql2 expects Buffer (not plain Uint8Array) for binary params.\nfunction toBufferView(bytes: Uint8Array): Buffer {\n if (Buffer.isBuffer(bytes)) return bytes;\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\nimport { checkLogsAffectReadSet, mapReadSetToRaw } from \"../server/overlap-checker\";\nimport { supaliveStringify } from \"../helper\";\nimport { CacheLayer } from \"./cache\";\nimport { Logger } from \"pino\";\n\n/**\n * mysql2 returns `ResultSetHeader` for non-SELECT queries (carrying\n * `affectedRows`) and `RowDataPacket[]` for SELECTs. The previous shim\n * blindly cast to T[] which made `rowCount` zero for UPDATE/DELETE, breaking\n * CAS detection. This helper picks the right shape.\n */\nfunction normalizeMysqlResult<T>(raw: unknown): DbQueryResult<T> {\n if (Array.isArray(raw)) {\n return { rows: raw as T[], rowCount: raw.length };\n }\n if (raw && typeof raw === \"object\" && \"affectedRows\" in raw) {\n return { rows: [], rowCount: Number((raw as { affectedRows: number }).affectedRows) || 0 };\n }\n return { rows: [], rowCount: 0 };\n}\n\ninterface QueryConnection {\n query(opts: { sql: string; timeout?: number; values?: unknown[] }): Promise<[any[], unknown]>;\n query(sql: string, params?: unknown[]): Promise<[any[], unknown]>;\n}\n\n/**\n * mysql2's PoolOptions does not have a per-statement timeout field; we\n * carry our own. Set 0 to disable.\n */\nexport type MySqlPoolOptions = PoolOptions & { queryTimeoutMs?: number };\n\nexport class MySqlDatabase implements Database {\n constructor(\n logger: Logger,\n config: MySqlPoolOptions,\n pool: Pool | undefined = undefined,\n ) {\n this.logger = logger;\n const { queryTimeoutMs, ...poolConfig } = config;\n this.queryTimeoutMs = queryTimeoutMs ?? 0;\n this.config = poolConfig;\n if (pool) {\n this.pool = pool;\n } else {\n this.pool = mysql.createPool(poolConfig);\n }\n }\n\n private logger: Logger;\n public config: PoolOptions;\n protected queryTimeoutMs: number;\n private pool: Pool;\n readonly dbType: DbType = \"mysql\";\n readonly sqlBuilder: SqlBuilder = mysqlSql;\n // Lazy per-table column-type cache. The apply path consults this for\n // unnest carriers/casts in batched writes; we never re-query pg_attribute\n // for a table we've already seen unless the cache is explicitly\n // invalidated (e.g. after a migration). Shared with tx clients via\n // adoptRegistries so a single startup load services all transactions.\n public columnTypes: Map<string, Map<string, string>> = new Map();\n // Compiled-SQL cache keyed by (op, table, sorted column signature).\n // Mirrors columnTypes — invalidated together when types change.\n protected sqlCache: Map<string, string> = new Map();\n\n /**\n * Fetches actual column types from MySQL for `table` and returns a\n * map of DB column name → MySQL type string (as produced by `COLUMN_TYPE`,\n * e.g. `bigint`, `integer`, `varchar(32)`, `text`, `json`).\n * No caching here — see {@link getColumnTypes} for the cached path.\n */\n async loadColumnTypesFromMySql(table: string): Promise<Map<string, string>> {\n const result = await this.query<{ column_name: string; mysql_type: string }>(\n `SELECT COLUMN_NAME AS column_name, COLUMN_TYPE AS mysql_type\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?\n ORDER BY ORDINAL_POSITION`,\n [table],\n );\n // MySQL folds unquoted identifiers to lowercase on the server side, so\n // COLUMN_NAME comes back lowercase. JS-side column keys\n // (`entry.data`) often arrive in camelCase from the schema layer; we\n // lookup via lowercase to bridge the two cases without making callers\n // worry about it.\n const out = new Map<string, string>();\n for (const row of result.rows) out.set(row.column_name.toLowerCase(), row.mysql_type);\n return out;\n }\n\n /**\n * Synchronous column-type lookup. The apply path calls this on every\n * batched write, so it can't await — populate the cache via\n * {@link bootstrapColumnTypes} at server start. Throws if `table` is\n * missing (programmer error / bootstrap skipped).\n */\n getColumnTypes(table: string): Map<string, string> | null {\n const hit = this.columnTypes.get(table);\n if (!hit) {\n this.logger.warn({ table }, \"MySqlDatabase: no cached column types fallback to non-batched writes\");\n return null;\n }\n return hit;\n }\n\n /**\n * Eagerly load column types into the in-memory cache. With a Redis\n * client supplied, attempts the cache key first and falls through to\n * MySQL on miss (writing the result back to Redis). This is the\n * \"one server queries MySQL, the rest read from Redis\" pattern for cold\n * starts in a multi-instance deploy. Without Redis, always queries MySQL.\n *\n * Pass `tables` to limit the load to a specific list; otherwise every\n * user table in the connected database is loaded.\n *\n * The Redis cache key should encode whatever invalidates types in your\n * environment (typically a schema version / deploy version). The\n * subscriber in supalive-server.ts is expected to publish a reload\n * signal after migrations and invoke {@link invalidateColumnTypes}.\n */\n async bootstrapColumnTypes(opts: {\n redis?: CacheLayer;\n cacheKey: string;\n tables?: string[];\n }): Promise<void> {\n this.invalidateColumnTypes();\n\n const { redis, cacheKey, tables } = opts;\n\n // Redis hit path: deserialize the full table → column → mysqlType map\n // and populate in one shot, skipping any INFORMATION_SCHEMA round-trips.\n if (redis) {\n const cached = await redis.getCachedTableColumnTypes(cacheKey);\n if (cached) {\n for (const [table, cols] of Object.entries(cached)) {\n this.columnTypes.set(table, new Map(Object.entries(cols)));\n }\n return;\n }\n }\n\n // Cache miss (or no Redis): query MySQL for the listed tables\n // (or enumerate all user tables) and populate.\n const names = tables ?? await this.listUserTables();\n for (const t of names) {\n if (this.columnTypes.has(t)) continue;\n\n const fresh = await this.loadColumnTypesFromMySql(t);\n this.columnTypes.set(t, fresh);\n }\n\n // Write back to Redis so subsequent server instances skip the MySQL hop.\n if (redis) {\n const dump: Record<string, Record<string, string>> = {};\n for (const [table, cols] of this.columnTypes) {\n dump[table] = Object.fromEntries(Object.entries(cols).sort());\n }\n await redis.setCachedTableColumnsTypes(cacheKey, dump);\n }\n }\n\n /**\n * Invalidate cached types (and dependent SQL) for `table`, or the entire\n * cache if `table` is omitted. The Redis-pubsub reload signal in\n * supalive-server.ts is expected to call this on schema changes.\n */\n invalidateColumnTypes(table?: string): void {\n if (table) {\n this.columnTypes.delete(table);\n for (const k of [...this.sqlCache.keys()]) {\n if (k.includes(`:${table}:`) || k === `d:${table}`) this.sqlCache.delete(k);\n }\n } else {\n this.columnTypes.clear();\n this.sqlCache.clear();\n }\n }\n\n /** Replace this instance's caches with shared references from a parent.\n * Used by getTransactionClient so types loaded once at startup are\n * visible inside transactions. */\n adoptCaches(\n columnTypes: Map<string, Map<string, string>>,\n sqlCache: Map<string, string>,\n ): void {\n this.columnTypes = columnTypes;\n this.sqlCache = sqlCache;\n }\n\n /** Enumerate the user-defined tables in the connected database for mysql — used\n * by bootstrapColumnTypes() when no explicit list is provided. */\n private async listUserTables(): Promise<string[]> {\n const result = await this.query<{ table_name: string }>(\n `SELECT table_name FROM information_schema.tables\n WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE'\n AND table_name NOT IN ('commit_logs', 'metadata', 'sequence')`\n );\n return result.rows.map(r => r.table_name);\n }\n\n migrationSql = [\n // Commit logs table (per-entry inserts, note 8)\n `CREATE TABLE IF NOT EXISTS commit_logs (\n id BINARY(16) NOT NULL,\n ts BIGINT NOT NULL,\n table_id BINARY(16) NOT NULL,\n data LONGBLOB NOT NULL,\n PRIMARY KEY (ts, table_id, id),\n INDEX commit_logs_by_table_and_id (table_id, id, ts)\n ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC`,\n // `CREATE INDEX IF NOT EXISTS commit_logs_by_table_ts_and_id ON commit_logs (table_id, ts, id)`,\n\n // Timestamp sequence table for MySQL\n `CREATE TABLE IF NOT EXISTS sequence (id INT NOT NULL)`,\n `INSERT IGNORE INTO sequence VALUES (0)`,\n\n // Metadata table\n `CREATE TABLE IF NOT EXISTS metadata (\n meta_key VARCHAR(255) PRIMARY KEY,\n meta_value BIGINT NOT NULL\n ) ENGINE=InnoDB;`,\n `INSERT IGNORE INTO metadata (meta_key, meta_value) VALUES ('latest_committed_ts', 0);`\n ];\n\n async query<T = any>(sql: string, params: unknown[] = []): Promise<DbQueryResult<T>> {\n const client = await this.pool.getConnection() as PoolConnection & QueryConnection;\n try {\n const [rows] = this.queryTimeoutMs > 0\n ? await client.query({ sql, values: params, timeout: this.queryTimeoutMs })\n : await client.query(sql, params);\n return normalizeMysqlResult<T>(rows);\n } catch (err) {\n throw translateMysqlError(err);\n } finally {\n client.release();\n }\n }\n\n async getClient(): Promise<PooledClient> {\n const client = await this.pool.getConnection();\n return client as unknown as PooledClient;\n }\n\n async getTransactionClient(): Promise<TxDatabase> {\n const client = await this.pool.getConnection();\n const tx = new MySqlTxDatabase(this.logger, { ...this.config, queryTimeoutMs: this.queryTimeoutMs }, this.pool, client as PoolConnection & QueryConnection);\n tx.adoptCaches(this.columnTypes, this.sqlCache);\n return tx;\n }\n\n async getLatestSnapshotTimestamp(): Promise<bigint> {\n const result = await this.query<{ meta_value: string | number }>(\"SELECT meta_value FROM metadata WHERE meta_key = 'latest_committed_ts'\");\n return BigInt(result.rows[0]?.meta_value ?? 0) || -1n;\n }\n\n async updateLatestSnapshotTimestamp(commitTs: bigint): Promise<void> {\n await this.query(\n `UPDATE metadata SET meta_value = ? WHERE meta_key = 'latest_committed_ts' AND meta_value < ?`,\n [commitTs, commitTs]\n );\n }\n\n async getNextTimestamp(): Promise<bigint> {\n const result = await this.query<{ id: string | number | bigint }>(\n \"UPDATE sequence SET id = LAST_INSERT_ID(id + 1); SELECT LAST_INSERT_ID() AS id\"\n );\n return BigInt(result.rows[0]?.id ?? 0) || -1n;\n }\n\n // Runs on the pool, not the tx client — intentionally. This keeps the\n // transaction window short, but it means `prevData` is not snapshot-\n // consistent with the eventual commitTs (a peer may have moved the row\n // between beginTs and this SELECT). That's safe because:\n // 1. The per-row CAS in pgApplyWrites is the real snapshot fence. If a\n // peer committed in our staleness window, the CAS sees a moved\n // commit_ts and throws OccConflictError → retry.\n // 2. The only window where CAS passes with \"stale\" prevData is when\n // the current row at our SELECT moment matches `expectedCommitTs`;\n // by construction nobody committed between our captured ts and now,\n // so prevData IS consistent with the ts we're CAS-ing against.\n // 3. The downstream consumer (overlap-checker.checkRowWriteAffectsRange)\n // is conservative on missing/odd prevData — \"unknown\" verdicts still\n // invalidate, so the worst case here is a spurious invalidation,\n // never a missed one.\n // Locked in by mysql.attach-prev-data.test.ts.\n async attachPrevDataToWriteSet(writeSet: WriteEntry[], readSet: ReadEntry[]): Promise<void> {\n const readTsByKey = new Map<string, bigint | null>();\n for (let i = readSet.length - 1; i >= 0; i--) {\n const r = readSet[i]!;\n if (r.kind !== \"point\" || r.expectedCommitTs === undefined) continue;\n\n const key = `${r.table} ${r.id}`;\n if (!readTsByKey.has(key)) readTsByKey.set(key, r.expectedCommitTs);\n }\n\n const byTable = new Map<string, WriteEntry[]>();\n for (const entry of writeSet) {\n if (entry.op !== \"update\" && entry.op !== \"delete\") continue;\n\n const bucket = byTable.get(entry.table);\n if (bucket) bucket.push(entry);\n else byTable.set(entry.table, [entry]);\n }\n if (byTable.size === 0) return;\n\n for (const [table, entries] of byTable) {\n const ids = entries.map((e) => e.id);\n const placeholders = ids.map(() => \"?\").join(\", \");\n // No FOR UPDATE — the per-row CAS on the subsequent UPDATE/DELETE is\n // the fence. If a peer mutated the row since our read, the CAS will\n // see a stale expected commit_ts and throw OCC.\n const sql = `SELECT * FROM ${table} WHERE id IN (${placeholders})`;\n const result = await this.query<Record<string, unknown>>(sql, ids);\n\n const byId = new Map<string, Record<string, unknown>>();\n for (const row of result.rows) {\n byId.set(String(row.id), row);\n }\n for (const entry of entries) {\n const row = byId.get(String(entry.id));\n const key = `${entry.table} ${entry.id}`;\n const priorReadTs = readTsByKey.get(key);\n\n if (row) {\n entry.prevData = row;\n // Prefer the read-time ts so read-then-update patterns get\n // beginTs-level isolation; fall back to current row ts for\n // blind writes (no prior read).\n entry.expectedCommitTs = priorReadTs !== undefined\n ? priorReadTs\n : BigInt(row.commit_ts as string | number | bigint);\n } else if (priorReadTs !== undefined) {\n // Row gone now, but we had read it earlier: carry the read ts —\n // the CAS will then mismatch (row deleted) and throw OCC.\n entry.expectedCommitTs = priorReadTs;\n }\n // else: neither a prior read nor a current row → leave undefined\n // so CAS misses and surfaces OCC.\n }\n }\n }\n\n // Prepare BEFORE the conflict scan: each write is a CAS against the row's\n // commit_ts, so any concurrent peer that touched the row produces a\n // 0-row-affected UPDATE/DELETE → OccConflictError. Inserts surface as\n // PK violations, also translated to OCC.\n async prepareCommitWrites(\n readSet: ReadEntry[],\n writeSet: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ): Promise<PreparedQueries> {\n const result: PreparedQuery[] = [];\n\n await this.mysqlPrepareBatchWrites(result, writeSet, commitTs);\n await this.mysqlPrepareCommitLogs(result, writeSet, commitTs);\n\n const hasRangeRead = readSet.some(r => r.kind === \"range\");\n if (!hasRangeRead) {\n const validateReads = this.mysqlPrepareValidatePointReadsByCommitTs(readSet, writeSet);\n return { commits: result, validateReadPoints: validateReads, hasRangeRead: false };\n }\n\n // has atleast one range read so use scan, prepare data\n const tableIds = [...new Set(readSet.map(r => r.tableId))];\n const rawReadSet = mapReadSetToRaw(readSet);\n\n return { commits: result, hasRangeRead: true, tableIds: tableIds, rawReadSet: rawReadSet };\n }\n\n private async mysqlPrepareBatchWrites(\n result: PreparedQuery[],\n writeSet: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ) {\n let i = 0;\n let counter = 0;\n while (i < writeSet.length) {\n counter++;\n const { table, op } = writeSet[i];\n let j = i + 1;\n while (j < writeSet.length && writeSet[j].table === table && writeSet[j].op === op) j++;\n\n const batch = writeSet.slice(i, j);\n if (op === \"insert\") await this.mysqlPrepareInsertBatch(result, table, batch, commitTs);\n else if (op === \"update\") await this.mysqlPrepareUpdateSingle(result, table, batch, commitTs);\n else await this.mysqlPrepareDeleteBatch(result, table, batch);\n i = j;\n\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n }\n }\n\n private async mysqlPrepareInsertBatch(\n result: PreparedQuery[],\n table: string,\n entries: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ) {\n if (entries.length === 0) return;\n\n const groups = new Map<string, { cols: string[]; rows: WriteEntry[] }>();\n for (const entry of entries) {\n const cols = [...Object.keys(entry.data ?? {}), 'commit_ts'].sort();\n const key = cols.join(\"|\");\n let g = groups.get(key);\n if (!g) { g = { cols, rows: [] }; groups.set(key, g); }\n g.rows.push(entry);\n }\n\n let counter = 0;\n for (const { cols, rows } of groups.values()) {\n counter++;\n\n const values: unknown[] = [];\n const tuples: string[] = [];\n for (const entry of rows) {\n const data = { ...(entry.data ?? {}), commit_ts: commitTs } as Record<string, unknown>;\n tuples.push(`(${cols.map(() => \"?\").join(\", \")})`);\n for (const col of cols) {\n values.push(data[col]);\n }\n }\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n\n result.push({\n sql: `INSERT INTO ${table} (${cols.join(\", \")}) VALUES ${tuples.join(\", \")}`,\n params: values,\n operation: \"insertBatch\",\n table: table,\n })\n }\n }\n\n private async mysqlPrepareUpdateSingle(\n result: PreparedQuery[],\n table: string,\n entries: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ) {\n if (entries.length === 0) return;\n\n let counter = 0;\n for (const entry of entries) {\n counter++;\n\n const data = { ...(entry.data ?? {}), commit_ts: commitTs };\n const columns = Object.keys(data);\n const sets = columns.map((c) => `${c} = ?`);\n const values = Object.values(data);\n const expected = entry.expectedCommitTs ?? -1n;\n\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n\n result.push({\n sql: `UPDATE ${table} SET ${sets.join(\", \")} WHERE id = ? AND commit_ts = ?`,\n params: [...values, entry.id, expected],\n operation: 'updateSingle',\n table: table,\n entryId: entry.id,\n expectedTs: expected,\n })\n }\n }\n\n private async mysqlPrepareDeleteBatch(\n result: PreparedQuery[],\n table: string,\n entries: WriteEntry[],\n ) {\n if (entries.length === 0) return;\n\n let counter = 0;\n for (const entry of entries) {\n counter++;\n\n const expected = entry.expectedCommitTs ?? -1n;\n\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n\n result.push({\n sql: `DELETE FROM ${table} WHERE id = ? AND commit_ts = ?`,\n params: [entry.id, expected],\n table: table,\n operation: 'deleteSingle',\n entryId: entry.id,\n expectedTs: expected,\n });\n }\n }\n\n private async mysqlPrepareCommitLogs(\n result: PreparedQuery[],\n writeEntries: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ) {\n if (writeEntries.length === 0) return;\n\n const values: unknown[] = [];\n const tuples: string[] = [];\n let counter = 0;\n\n for (const entry of writeEntries) {\n counter++;\n\n tuples.push(`(?, ?, ?, ?)`);\n values.push(\n toBufferView(normalizeIdToBytes(entry.id)),\n commitTs,\n toBufferView(entry.tableId),\n toBufferView(utf8Encode(supaliveStringify(entry))),\n );\n\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n }\n\n result.push({\n sql: `INSERT INTO commit_logs (id, ts, table_id, data) VALUES ${tuples.join(\", \")}`,\n params: values,\n table: 'commit_logs',\n operation: 'commit_logs',\n })\n }\n\n /**\n * Point-only OCC check. For each genuine point read, compare the row's\n * current commit_ts against the value captured at read time. A `null`\n * expectedCommitTs means \"row didn't exist when we read\"; any row found\n * now is a conflict. Reads whose row is being written in this same txn\n * are skipped — the CAS UPDATE/DELETE already validated those.\n */\n private mysqlPrepareValidatePointReadsByCommitTs(\n readSet: ReadEntry[],\n writeSet: WriteEntry[],\n ): PreparedQuery[] {\n const result: PreparedQuery[] = [];\n\n // Skip reads whose row is being mutated in this same tx — CAS already\n // fenced them. We dedupe per (table, id) so duplicate reads of the same\n // row don't cause extra fetches.\n const writeKeys = new Set<string>();\n for (const w of writeSet) writeKeys.add(`${w.table} ${w.id}`);\n\n const byTable = new Map<string, PendingPointEntry[]>();\n const seen = new Set<string>();\n\n for (const entry of readSet) {\n if (entry.kind !== \"point\") continue;\n\n const key = `${entry.table} ${entry.id}`;\n if (writeKeys.has(key) || seen.has(key)) continue;\n\n seen.add(key);\n // expectedCommitTs === undefined → no commit_ts captured at read time\n // (synthetic or pre-migration). Skip — we cannot CAS-validate it. This\n // path should only fire when callers construct PointReads externally.\n if (entry.expectedCommitTs === undefined) continue;\n\n const bucket = byTable.get(entry.table);\n if (bucket) bucket.push({ entry, key });\n else byTable.set(entry.table, [{ entry, key }]);\n }\n\n for (const [table, pendings] of byTable) {\n const ids = pendings.map((p) => p.entry.id);\n const placeholders = ids.map(() => \"?\").join(\", \");\n\n result.push({\n sql: `SELECT id, commit_ts FROM ${table} WHERE id IN (${placeholders})`,\n params: ids,\n table: table,\n operation: 'pointReadValidation',\n pendingsEntry: pendings,\n });\n }\n\n return result;\n }\n\n async commitWrites(\n beginTs: bigint,\n queries: PreparedQueries,\n commitTs: bigint,\n ): Promise<{ success: boolean }> {\n await this.mysqlApplyWrites(queries.commits);\n\n // Fast path: when the readSet has no range reads, we don't need a\n // commit-log scan at all — point reads validate via per-row commit_ts,\n // and writes already self-validated via CAS above. This is the dominant\n // shape (most mutations target known ids) and eliminates the heaviest\n // OCC cost in the previous design.\n if (!queries.hasRangeRead) {\n if ((queries.validateReadPoints?.length ?? 0) > 0) {\n await this.validatePointReadsByCommitTs(queries.validateReadPoints ?? []);\n }\n return { success: true };\n }\n\n // Slow path: at least one range read present. Fall back to the\n // commit-log scan so phantom inserts and predicate transitions-in are\n // still caught. Point reads in the same set are covered by the same\n // scan, so no separate validation is needed.\n const logs = await this.getCommitLogsSinceTs(beginTs, commitTs, queries.tableIds ?? []);\n const hasConflict = checkLogsAffectReadSet(logs, queries.rawReadSet ?? []);\n if (hasConflict) {\n throw new OccConflictError(\n `Conflict detected: overlapping commit logs since ${beginTs}`,\n { logs }\n );\n }\n\n return { success: true };\n }\n\n // Walks the writeSet in order and coalesces consecutive entries with the\n // same (table, op) into one batched statement. Order is preserved across\n // batch boundaries so replace-patterns (delete-then-insert of the same\n // id) behave identically to the per-row code path. Single-row batches\n // take a direct INSERT/UPDATE/DELETE fast-path to avoid the unnest+join\n // overhead, which matters under high contention.\n private async mysqlApplyWrites(result: PreparedQuery[]): Promise<void> {\n for (const q of result) {\n switch (q.operation) {\n case 'insertBatch': {\n try {\n await this.query(q.sql, q.params);\n } catch (err) {\n if (\n err && typeof err === \"object\" &&\n ((err as { errno?: number }).errno === 1062 ||\n (err as { code?: string }).code === \"ER_DUP_ENTRY\")\n ) {\n const msg = (err as { message?: string }).message ?? \"\";\n const idMatch = msg.match(/key '[^']+'.*?\\(.*?\\)=\\(?([^,\\)]+)/);\n const failedId = idMatch?.[1];\n throw new OccConflictError(\n failedId !== undefined\n ? `Conflict: insert into ${q.table}/${failedId} hit duplicate key`\n : `Conflict: batch insert into ${q.table} hit duplicate key`,\n err,\n );\n }\n throw err;\n }\n break;\n }\n case 'updateSingle': {\n const result = await this.query(q.sql, q.params);\n if ((result.rowCount ?? 0) === 0) {\n throw new OccConflictError(\n `Conflict: CAS update of ${q.table}/${q.entryId} (expected commit_ts=${q.expectedTs}) matched no rows`,\n { table: q.table, id: q.entryId, expected: q.expectedTs },\n );\n }\n break;\n }\n case 'deleteBatch': {\n const result = await this.query(q.sql, q.params);\n if ((result.rowCount ?? 0) === 0) {\n throw new OccConflictError(\n `Conflict: CAS delete of ${q.table}/${q.entryId} (expected commit_ts=${q.expectedTs}) matched no rows`,\n { table: q.table, id: q.entryId, expected: q.expectedTs },\n );\n }\n break;\n }\n case 'commit_logs': {\n await this.query(q.sql, q.params);\n break;\n }\n default:\n throw new Error(\"Unhandled MySQL Operation: \" + q.operation);\n\n }\n }\n }\n\n private async validatePointReadsByCommitTs(queries: PreparedQuery[]): Promise<void> {\n\n for (const q of queries) {\n const result = await this.query<{ id: string; commit_ts: string | number | bigint }>(q.sql, q.params);\n\n const currentById = new Map<string, bigint>();\n for (const row of result.rows) {\n currentById.set(String(row.id), BigInt(row.commit_ts));\n }\n\n for (const { entry } of q.pendingsEntry ?? []) {\n const current = currentById.get(String(entry.id));\n const expected = entry.expectedCommitTs;\n\n if (expected === null) {\n // We read \"no row\"; conflict if a row now exists.\n if (current !== undefined) {\n throw new OccConflictError(\n `Conflict: row ${entry.table}/${entry.id} was inserted concurrently`,\n { table: entry.table, id: entry.id }\n );\n }\n } else {\n if (current === undefined) {\n throw new OccConflictError(\n `Conflict: row ${entry.table}/${entry.id} was deleted concurrently`,\n { table: entry.table, id: entry.id, expected }\n );\n }\n if (current !== expected) {\n throw new OccConflictError(\n `Conflict: row ${entry.table}/${entry.id} changed from ts=${expected} to ts=${current}`,\n { table: entry.table, id: entry.id, expected, current }\n );\n }\n }\n }\n }\n }\n\n async pruneCommitLogsBefore(ts: bigint): Promise<bigint> {\n const result = await this.query(\n `DELETE FROM commit_logs WHERE ts < ?`,\n [ts]\n );\n return BigInt(result.rowCount ?? 0);\n }\n\n async getCommitLogsBetweenTs(beginTs: bigint, endTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]> {\n if (tableIds.length === 0) return [];\n\n const placeholders = tableIds.map(() => '?').join(\", \");\n const sql = `SELECT id, ts, table_id, data FROM commit_logs WHERE ts >= ? AND ts < ? AND table_id IN (${placeholders})`;\n\n const result = await this.query<{ id: unknown; ts: string | number | bigint; table_id: unknown; data: unknown }>(\n sql,\n [beginTs, endTs, ...tableIds.map(toBufferView)]\n );\n\n return result.rows.map((row) => ({\n id: normalizeToBytes(row.id),\n ts: BigInt(row.ts),\n tableId: normalizeToBytes(row.table_id),\n data: normalizeToBytes(row.data),\n }));\n }\n\n async getCommitLogsSinceTs(sinceTs: bigint, excludeTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]> {\n if (tableIds.length === 0) return [];\n\n const placeholders = tableIds.map(() => '?').join(\", \");\n const sql = `SELECT id, ts, table_id, data FROM commit_logs WHERE ts >= ? AND ts <> ? AND table_id IN (${placeholders})`;\n\n const result = await this.query<{ id: unknown; ts: string | number | bigint; table_id: unknown; data: unknown }>(\n sql,\n [sinceTs, excludeTs, ...tableIds.map(toBufferView)]\n );\n\n return result.rows.map((row) => ({\n id: normalizeToBytes(row.id),\n ts: BigInt(row.ts),\n tableId: normalizeToBytes(row.table_id),\n data: normalizeToBytes(row.data),\n }));\n }\n\n async close(): Promise<void> {\n await this.pool.end();\n }\n}\n\nexport class MySqlTxDatabase extends MySqlDatabase {\n constructor(logger: Logger, config: MySqlPoolOptions, pool: Pool, client: PoolConnection & QueryConnection) {\n super(logger, config, pool);\n this.client = client;\n }\n\n private client: PoolConnection & QueryConnection;\n\n async query<T = any>(sql: string, params: unknown[] = []): Promise<DbQueryResult<T>> {\n try {\n const [rows] = this.queryTimeoutMs > 0\n ? await this.client.query({ sql, values: params as any[], timeout: this.queryTimeoutMs })\n : await this.client.query(sql, params as any[]);\n return normalizeMysqlResult<T>(rows);\n } catch (err) {\n throw translateMysqlError(err);\n }\n }\n\n async begin(): Promise<void> {\n await this.client.beginTransaction();\n }\n\n async commit(): Promise<void> {\n await this.client.commit();\n }\n\n async rollback(): Promise<void> {\n await this.client.rollback();\n }\n\n release(): void {\n this.client.release();\n }\n}\n\n/**\n * MySQL InnoDB deadlock (errno 1213 / SQLSTATE 40001) is transient and\n * semantically equivalent to an OCC conflict from the mutation runner's\n * perspective: re-execute the handler with a fresh snapshot. Wrapping\n * here lets realtime_db.ts stay driver-agnostic — its retry loop already\n * handles OccConflictError.\n */\nfunction translateMysqlError(err: unknown): unknown {\n if (\n err && typeof err === \"object\" &&\n ((err as { errno?: number }).errno === 1213 ||\n (err as { code?: string }).code === \"ER_LOCK_DEADLOCK\")\n ) {\n return new OccConflictError(\"deadlock detected\", err);\n }\n return err;\n}\n\nconst mysqlSql: SqlBuilder = {\n placeholder: (i) => `?`,\n like: (col, i) => `${col} LIKE ?`,\n ilike: (col, i) => `${col} LIKE ?`, // MySQL doesn't have ILIKE\n icontains: (col, i) => `${col} LIKE ?`,\n // CAST(? AS JSON) lets the driver bind the param as a regular string\n // (JSON-serialized client-side) and MySQL re-parses it into a JSON value\n // for containment comparison. When a sub-path is set, JSON_CONTAINS takes\n // the path as its third argument.\n jsonContains: (col, _i, opts) => opts?.pathIndex !== undefined\n ? `JSON_CONTAINS(${col}, CAST(? AS JSON), ?)`\n : `JSON_CONTAINS(${col}, CAST(? AS JSON))`,\n jsonContainedBy: (col, _i, opts) => opts?.pathIndex !== undefined\n // For \"is the column contained in the candidate at this sub-path of the\n // column\" we still need to extract the sub-path from the column side.\n // JSON_CONTAINS's path arg is on the TARGET position, so we flip and use\n // JSON_EXTRACT for the column side instead.\n ? `JSON_CONTAINS(CAST(? AS JSON), JSON_EXTRACT(${col}, ?))`\n : `JSON_CONTAINS(CAST(? AS JSON), ${col})`,\n jsonHasKey: (col, _i, opts) => {\n if (opts?.pathCount && opts.pathCount > 0) {\n const mode = opts.mode === \"all\" ? \"'all'\" : \"'one'\";\n const places = new Array(opts.pathCount).fill(\"?\").join(\", \");\n return `JSON_CONTAINS_PATH(${col}, ${mode}, ${places})`;\n }\n return opts?.raw\n // Param is already a JSON path expression like `$.foo.bar` or `$.\"a\".\"b\"`.\n ? `JSON_CONTAINS_PATH(${col}, 'one', ?)`\n // Param is a literal top-level key. Wrap it in `$.\"<key>\"` server-side\n // and escape any embedded double-quotes so dotted keys behave as keys\n // and not nested paths.\n : `JSON_CONTAINS_PATH(${col}, 'one', CONCAT('$.\"', REPLACE(?, '\"', '\\\\\\\\\"'), '\"'))`;\n },\n jsonArrayContains: (col, _i, opts) => opts?.pathIndex !== undefined\n ? `JSON_CONTAINS(${col}, JSON_ARRAY(CAST(? AS JSON)), ?)`\n : `JSON_CONTAINS(${col}, JSON_ARRAY(CAST(? AS JSON)))`,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mysql-bvnjYWvZ.js","names":[],"sources":["../src/db/mysql.ts"],"sourcesContent":["import mysql, { Pool, PoolConnection, PoolOptions } from \"mysql2/promise\";\nimport { Database, DbQueryResult, DbType, LazyCommitTsParam, PendingPointEntry, PooledClient, PreparedQueries, PreparedQuery, SqlBuilder, TxDatabase } from \"./db\";\nimport { CommitLogEntry, normalizeIdToBytes, normalizeToBytes, OccConflictError, PointRead, ReadEntry, WriteEntry } from \"./types_db\";\nimport { utf8Encode } from \"./bytes\";\n\n// mysql2 expects Buffer (not plain Uint8Array) for binary params.\nfunction toBufferView(bytes: Uint8Array): Buffer {\n if (Buffer.isBuffer(bytes)) return bytes;\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\nimport { checkLogsAffectReadSet, mapReadSetToRaw } from \"../server/overlap-checker\";\nimport { supaliveStringify } from \"../helper\";\nimport { CacheLayer } from \"./cache\";\nimport { Logger } from \"pino\";\n\n/**\n * mysql2 returns `ResultSetHeader` for non-SELECT queries (carrying\n * `affectedRows`) and `RowDataPacket[]` for SELECTs. The previous shim\n * blindly cast to T[] which made `rowCount` zero for UPDATE/DELETE, breaking\n * CAS detection. This helper picks the right shape.\n */\nfunction normalizeMysqlResult<T>(raw: unknown): DbQueryResult<T> {\n if (Array.isArray(raw)) {\n return { rows: raw as T[], rowCount: raw.length };\n }\n if (raw && typeof raw === \"object\" && \"affectedRows\" in raw) {\n return { rows: [], rowCount: Number((raw as { affectedRows: number }).affectedRows) || 0 };\n }\n return { rows: [], rowCount: 0 };\n}\n\ninterface QueryConnection {\n query(opts: { sql: string; timeout?: number; values?: unknown[] }): Promise<[any[], unknown]>;\n query(sql: string, params?: unknown[]): Promise<[any[], unknown]>;\n}\n\n/**\n * mysql2's PoolOptions does not have a per-statement timeout field; we\n * carry our own. Set 0 to disable.\n */\nexport type MySqlPoolOptions = PoolOptions & { queryTimeoutMs?: number };\n\nexport class MySqlDatabase implements Database {\n constructor(\n logger: Logger,\n config: MySqlPoolOptions,\n pool: Pool | undefined = undefined,\n ) {\n this.logger = logger;\n const { queryTimeoutMs, ...poolConfig } = config;\n this.queryTimeoutMs = queryTimeoutMs ?? 0;\n this.config = poolConfig;\n if (pool) {\n this.pool = pool;\n } else {\n this.pool = mysql.createPool(poolConfig);\n }\n }\n\n private logger: Logger;\n public config: PoolOptions;\n protected queryTimeoutMs: number;\n private pool: Pool;\n readonly dbType: DbType = \"mysql\";\n readonly sqlBuilder: SqlBuilder = mysqlSql;\n // Lazy per-table column-type cache. The apply path consults this for\n // unnest carriers/casts in batched writes; we never re-query pg_attribute\n // for a table we've already seen unless the cache is explicitly\n // invalidated (e.g. after a migration). Shared with tx clients via\n // adoptRegistries so a single startup load services all transactions.\n public columnTypes: Map<string, Map<string, string>> = new Map();\n // Compiled-SQL cache keyed by (op, table, sorted column signature).\n // Mirrors columnTypes — invalidated together when types change.\n protected sqlCache: Map<string, string> = new Map();\n\n /**\n * Fetches actual column types from MySQL for `table` and returns a\n * map of DB column name → MySQL type string (as produced by `COLUMN_TYPE`,\n * e.g. `bigint`, `integer`, `varchar(32)`, `text`, `json`).\n * No caching here — see {@link getColumnTypes} for the cached path.\n */\n async loadColumnTypesFromMySql(table: string): Promise<Map<string, string>> {\n const result = await this.query<{ column_name: string; mysql_type: string }>(\n `SELECT COLUMN_NAME AS column_name, COLUMN_TYPE AS mysql_type\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?\n ORDER BY ORDINAL_POSITION`,\n [table],\n );\n // MySQL folds unquoted identifiers to lowercase on the server side, so\n // COLUMN_NAME comes back lowercase. JS-side column keys\n // (`entry.data`) often arrive in camelCase from the schema layer; we\n // lookup via lowercase to bridge the two cases without making callers\n // worry about it.\n const out = new Map<string, string>();\n for (const row of result.rows) out.set(row.column_name.toLowerCase(), row.mysql_type);\n return out;\n }\n\n /**\n * Synchronous column-type lookup. The apply path calls this on every\n * batched write, so it can't await — populate the cache via\n * {@link bootstrapColumnTypes} at server start. Throws if `table` is\n * missing (programmer error / bootstrap skipped).\n */\n getColumnTypes(table: string): Map<string, string> | null {\n const hit = this.columnTypes.get(table);\n if (!hit) {\n this.logger.warn({ table }, \"MySqlDatabase: no cached column types fallback to non-batched writes\");\n return null;\n }\n return hit;\n }\n\n /**\n * Eagerly load column types into the in-memory cache. With a Redis\n * client supplied, attempts the cache key first and falls through to\n * MySQL on miss (writing the result back to Redis). This is the\n * \"one server queries MySQL, the rest read from Redis\" pattern for cold\n * starts in a multi-instance deploy. Without Redis, always queries MySQL.\n *\n * Pass `tables` to limit the load to a specific list; otherwise every\n * user table in the connected database is loaded.\n *\n * The Redis cache key should encode whatever invalidates types in your\n * environment (typically a schema version / deploy version). The\n * subscriber in supalive-server.ts is expected to publish a reload\n * signal after migrations and invoke {@link invalidateColumnTypes}.\n */\n async bootstrapColumnTypes(opts: {\n redis?: CacheLayer;\n cacheKey: string;\n tables?: string[];\n }): Promise<void> {\n this.invalidateColumnTypes();\n\n const { redis, cacheKey, tables } = opts;\n\n // Redis hit path: deserialize the full table → column → mysqlType map\n // and populate in one shot, skipping any INFORMATION_SCHEMA round-trips.\n if (redis) {\n const cached = await redis.getCachedTableColumnTypes(cacheKey);\n if (cached) {\n for (const [table, cols] of Object.entries(cached)) {\n this.columnTypes.set(table, new Map(Object.entries(cols)));\n }\n return;\n }\n }\n\n // Cache miss (or no Redis): query MySQL for the listed tables\n // (or enumerate all user tables) and populate.\n const names = tables ?? await this.listUserTables();\n for (const t of names) {\n if (this.columnTypes.has(t)) continue;\n\n const fresh = await this.loadColumnTypesFromMySql(t);\n this.columnTypes.set(t, fresh);\n }\n\n // Write back to Redis so subsequent server instances skip the MySQL hop.\n if (redis) {\n const dump: Record<string, Record<string, string>> = {};\n for (const [table, cols] of this.columnTypes) {\n dump[table] = Object.fromEntries(Object.entries(cols).sort());\n }\n await redis.setCachedTableColumnsTypes(cacheKey, dump);\n }\n }\n\n /**\n * Invalidate cached types (and dependent SQL) for `table`, or the entire\n * cache if `table` is omitted. The Redis-pubsub reload signal in\n * supalive-server.ts is expected to call this on schema changes.\n */\n invalidateColumnTypes(table?: string): void {\n if (table) {\n this.columnTypes.delete(table);\n for (const k of [...this.sqlCache.keys()]) {\n if (k.includes(`:${table}:`) || k === `d:${table}`) this.sqlCache.delete(k);\n }\n } else {\n this.columnTypes.clear();\n this.sqlCache.clear();\n }\n }\n\n /** Replace this instance's caches with shared references from a parent.\n * Used by getTransactionClient so types loaded once at startup are\n * visible inside transactions. */\n adoptCaches(\n columnTypes: Map<string, Map<string, string>>,\n sqlCache: Map<string, string>,\n ): void {\n this.columnTypes = columnTypes;\n this.sqlCache = sqlCache;\n }\n\n /** Enumerate the user-defined tables in the connected database for mysql — used\n * by bootstrapColumnTypes() when no explicit list is provided. */\n private async listUserTables(): Promise<string[]> {\n const result = await this.query<{ table_name: string }>(\n `SELECT table_name FROM information_schema.tables\n WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE'\n AND table_name NOT IN ('commit_logs', 'metadata', 'sequence')`\n );\n return result.rows.map(r => r.table_name);\n }\n\n migrationSql = [\n // Commit logs table (per-entry inserts, note 8)\n `CREATE TABLE IF NOT EXISTS commit_logs (\n id BINARY(16) NOT NULL,\n ts BIGINT NOT NULL,\n table_id BINARY(16) NOT NULL,\n data LONGBLOB NOT NULL,\n PRIMARY KEY (ts, table_id, id),\n INDEX commit_logs_by_table_and_id (table_id, id, ts)\n ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC`,\n // `CREATE INDEX IF NOT EXISTS commit_logs_by_table_ts_and_id ON commit_logs (table_id, ts, id)`,\n\n // Timestamp sequence table for MySQL\n `CREATE TABLE IF NOT EXISTS sequence (id INT NOT NULL)`,\n `INSERT IGNORE INTO sequence VALUES (0)`,\n\n // Metadata table\n `CREATE TABLE IF NOT EXISTS metadata (\n meta_key VARCHAR(255) PRIMARY KEY,\n meta_value BIGINT NOT NULL\n ) ENGINE=InnoDB;`,\n `INSERT IGNORE INTO metadata (meta_key, meta_value) VALUES ('latest_committed_ts', 0);`\n ];\n\n async query<T = any>(sql: string, params: unknown[] = []): Promise<DbQueryResult<T>> {\n const client = await this.pool.getConnection() as PoolConnection & QueryConnection;\n try {\n const [rows] = this.queryTimeoutMs > 0\n ? await client.query({ sql, values: params, timeout: this.queryTimeoutMs })\n : await client.query(sql, params);\n return normalizeMysqlResult<T>(rows);\n } catch (err) {\n throw translateMysqlError(err);\n } finally {\n client.release();\n }\n }\n\n async getClient(): Promise<PooledClient> {\n const client = await this.pool.getConnection();\n return client as unknown as PooledClient;\n }\n\n async getTransactionClient(): Promise<TxDatabase> {\n const client = await this.pool.getConnection();\n const tx = new MySqlTxDatabase(this.logger, { ...this.config, queryTimeoutMs: this.queryTimeoutMs }, this.pool, client as PoolConnection & QueryConnection);\n tx.adoptCaches(this.columnTypes, this.sqlCache);\n return tx;\n }\n\n async getLatestSnapshotTimestamp(): Promise<bigint> {\n const result = await this.query<{ meta_value: string | number }>(\"SELECT meta_value FROM metadata WHERE meta_key = 'latest_committed_ts'\");\n return BigInt(result.rows[0]?.meta_value ?? 0) || -1n;\n }\n\n async updateLatestSnapshotTimestamp(commitTs: bigint): Promise<void> {\n await this.query(\n `UPDATE metadata SET meta_value = ? WHERE meta_key = 'latest_committed_ts' AND meta_value < ?`,\n [commitTs, commitTs]\n );\n }\n\n async getNextTimestamp(): Promise<bigint> {\n const result = await this.query<{ id: string | number | bigint }>(\n \"UPDATE sequence SET id = LAST_INSERT_ID(id + 1); SELECT LAST_INSERT_ID() AS id\"\n );\n return BigInt(result.rows[0]?.id ?? 0) || -1n;\n }\n\n // Runs on the pool, not the tx client — intentionally. This keeps the\n // transaction window short, but it means `prevData` is not snapshot-\n // consistent with the eventual commitTs (a peer may have moved the row\n // between beginTs and this SELECT). That's safe because:\n // 1. The per-row CAS in pgApplyWrites is the real snapshot fence. If a\n // peer committed in our staleness window, the CAS sees a moved\n // commit_ts and throws OccConflictError → retry.\n // 2. The only window where CAS passes with \"stale\" prevData is when\n // the current row at our SELECT moment matches `expectedCommitTs`;\n // by construction nobody committed between our captured ts and now,\n // so prevData IS consistent with the ts we're CAS-ing against.\n // 3. The downstream consumer (overlap-checker.checkRowWriteAffectsRange)\n // is conservative on missing/odd prevData — \"unknown\" verdicts still\n // invalidate, so the worst case here is a spurious invalidation,\n // never a missed one.\n // Locked in by mysql.attach-prev-data.test.ts.\n async attachPrevDataToWriteSet(writeSet: WriteEntry[], readSet: ReadEntry[]): Promise<void> {\n const readTsByKey = new Map<string, bigint | null>();\n for (let i = readSet.length - 1; i >= 0; i--) {\n const r = readSet[i]!;\n if (r.kind !== \"point\" || r.expectedCommitTs === undefined) continue;\n\n const key = `${r.table} ${r.id}`;\n if (!readTsByKey.has(key)) readTsByKey.set(key, r.expectedCommitTs);\n }\n\n const byTable = new Map<string, WriteEntry[]>();\n for (const entry of writeSet) {\n if (entry.op !== \"update\" && entry.op !== \"delete\") continue;\n\n const bucket = byTable.get(entry.table);\n if (bucket) bucket.push(entry);\n else byTable.set(entry.table, [entry]);\n }\n if (byTable.size === 0) return;\n\n for (const [table, entries] of byTable) {\n const ids = entries.map((e) => e.id);\n const placeholders = ids.map(() => \"?\").join(\", \");\n // No FOR UPDATE — the per-row CAS on the subsequent UPDATE/DELETE is\n // the fence. If a peer mutated the row since our read, the CAS will\n // see a stale expected commit_ts and throw OCC.\n const sql = `SELECT * FROM ${table} WHERE id IN (${placeholders})`;\n const result = await this.query<Record<string, unknown>>(sql, ids);\n\n const byId = new Map<string, Record<string, unknown>>();\n for (const row of result.rows) {\n byId.set(String(row.id), row);\n }\n for (const entry of entries) {\n const row = byId.get(String(entry.id));\n const key = `${entry.table} ${entry.id}`;\n const priorReadTs = readTsByKey.get(key);\n\n if (row) {\n entry.prevData = row;\n // Prefer the read-time ts so read-then-update patterns get\n // beginTs-level isolation; fall back to current row ts for\n // blind writes (no prior read).\n entry.expectedCommitTs = priorReadTs !== undefined\n ? priorReadTs\n : BigInt(row.commit_ts as string | number | bigint);\n } else if (priorReadTs !== undefined) {\n // Row gone now, but we had read it earlier: carry the read ts —\n // the CAS will then mismatch (row deleted) and throw OCC.\n entry.expectedCommitTs = priorReadTs;\n }\n // else: neither a prior read nor a current row → leave undefined\n // so CAS misses and surfaces OCC.\n }\n }\n }\n\n // Prepare BEFORE the conflict scan: each write is a CAS against the row's\n // commit_ts, so any concurrent peer that touched the row produces a\n // 0-row-affected UPDATE/DELETE → OccConflictError. Inserts surface as\n // PK violations, also translated to OCC.\n async prepareCommitWrites(\n readSet: ReadEntry[],\n writeSet: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ): Promise<PreparedQueries> {\n const result: PreparedQuery[] = [];\n\n await this.mysqlPrepareBatchWrites(result, writeSet, commitTs);\n await this.mysqlPrepareCommitLogs(result, writeSet, commitTs);\n\n const hasRangeRead = readSet.some(r => r.kind === \"range\");\n if (!hasRangeRead) {\n const validateReads = this.mysqlPrepareValidatePointReadsByCommitTs(readSet, writeSet);\n return { commits: result, validateReadPoints: validateReads, hasRangeRead: false };\n }\n\n // has atleast one range read so use scan, prepare data\n const tableIds = [...new Set(readSet.map(r => r.tableId))];\n const rawReadSet = mapReadSetToRaw(readSet);\n\n return { commits: result, hasRangeRead: true, tableIds: tableIds, rawReadSet: rawReadSet };\n }\n\n private async mysqlPrepareBatchWrites(\n result: PreparedQuery[],\n writeSet: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ) {\n let i = 0;\n let counter = 0;\n while (i < writeSet.length) {\n counter++;\n const { table, op } = writeSet[i];\n let j = i + 1;\n while (j < writeSet.length && writeSet[j].table === table && writeSet[j].op === op) j++;\n\n const batch = writeSet.slice(i, j);\n if (op === \"insert\") await this.mysqlPrepareInsertBatch(result, table, batch, commitTs);\n else if (op === \"update\") await this.mysqlPrepareUpdateSingle(result, table, batch, commitTs);\n else await this.mysqlPrepareDeleteBatch(result, table, batch);\n i = j;\n\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n }\n }\n\n private async mysqlPrepareInsertBatch(\n result: PreparedQuery[],\n table: string,\n entries: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ) {\n if (entries.length === 0) return;\n\n const groups = new Map<string, { cols: string[]; rows: WriteEntry[] }>();\n for (const entry of entries) {\n const cols = [...Object.keys(entry.data ?? {}), 'commit_ts'].sort();\n const key = cols.join(\"|\");\n let g = groups.get(key);\n if (!g) { g = { cols, rows: [] }; groups.set(key, g); }\n g.rows.push(entry);\n }\n\n let counter = 0;\n for (const { cols, rows } of groups.values()) {\n counter++;\n\n const values: unknown[] = [];\n const tuples: string[] = [];\n for (const entry of rows) {\n const data = { ...(entry.data ?? {}), commit_ts: commitTs } as Record<string, unknown>;\n tuples.push(`(${cols.map(() => \"?\").join(\", \")})`);\n for (const col of cols) {\n values.push(data[col]);\n }\n }\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n\n result.push({\n sql: `INSERT INTO ${table} (${cols.join(\", \")}) VALUES ${tuples.join(\", \")}`,\n params: values,\n operation: \"insertBatch\",\n table: table,\n })\n }\n }\n\n private async mysqlPrepareUpdateSingle(\n result: PreparedQuery[],\n table: string,\n entries: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ) {\n if (entries.length === 0) return;\n\n let counter = 0;\n for (const entry of entries) {\n counter++;\n\n const data = { ...(entry.data ?? {}), commit_ts: commitTs };\n const columns = Object.keys(data);\n const sets = columns.map((c) => `${c} = ?`);\n const values = Object.values(data);\n const expected = entry.expectedCommitTs ?? -1n;\n\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n\n result.push({\n sql: `UPDATE ${table} SET ${sets.join(\", \")} WHERE id = ? AND commit_ts = ?`,\n params: [...values, entry.id, expected],\n operation: 'updateSingle',\n table: table,\n entryId: entry.id,\n expectedTs: expected,\n })\n }\n }\n\n private async mysqlPrepareDeleteBatch(\n result: PreparedQuery[],\n table: string,\n entries: WriteEntry[],\n ) {\n if (entries.length === 0) return;\n\n let counter = 0;\n for (const entry of entries) {\n counter++;\n\n const expected = entry.expectedCommitTs ?? -1n;\n\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n\n result.push({\n sql: `DELETE FROM ${table} WHERE id = ? AND commit_ts = ?`,\n params: [entry.id, expected],\n table: table,\n operation: 'deleteSingle',\n entryId: entry.id,\n expectedTs: expected,\n });\n }\n }\n\n private async mysqlPrepareCommitLogs(\n result: PreparedQuery[],\n writeEntries: WriteEntry[],\n commitTs: LazyCommitTsParam,\n ) {\n if (writeEntries.length === 0) return;\n\n const values: unknown[] = [];\n const tuples: string[] = [];\n let counter = 0;\n\n for (const entry of writeEntries) {\n counter++;\n\n tuples.push(`(?, ?, ?, ?)`);\n values.push(\n toBufferView(normalizeIdToBytes(entry.id)),\n commitTs,\n toBufferView(entry.tableId),\n toBufferView(utf8Encode(supaliveStringify(entry))),\n );\n\n if (counter % 50 == 0) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n }\n\n result.push({\n sql: `INSERT INTO commit_logs (id, ts, table_id, data) VALUES ${tuples.join(\", \")}`,\n params: values,\n table: 'commit_logs',\n operation: 'commit_logs',\n })\n }\n\n /**\n * Point-only OCC check. For each genuine point read, compare the row's\n * current commit_ts against the value captured at read time. A `null`\n * expectedCommitTs means \"row didn't exist when we read\"; any row found\n * now is a conflict. Reads whose row is being written in this same txn\n * are skipped — the CAS UPDATE/DELETE already validated those.\n */\n private mysqlPrepareValidatePointReadsByCommitTs(\n readSet: ReadEntry[],\n writeSet: WriteEntry[],\n ): PreparedQuery[] {\n const result: PreparedQuery[] = [];\n\n // Skip reads whose row is being mutated in this same tx — CAS already\n // fenced them. We dedupe per (table, id) so duplicate reads of the same\n // row don't cause extra fetches.\n const writeKeys = new Set<string>();\n for (const w of writeSet) writeKeys.add(`${w.table} ${w.id}`);\n\n const byTable = new Map<string, PendingPointEntry[]>();\n const seen = new Set<string>();\n\n for (const entry of readSet) {\n if (entry.kind !== \"point\") continue;\n\n const key = `${entry.table} ${entry.id}`;\n if (writeKeys.has(key) || seen.has(key)) continue;\n\n seen.add(key);\n // expectedCommitTs === undefined → no commit_ts captured at read time\n // (synthetic or pre-migration). Skip — we cannot CAS-validate it. This\n // path should only fire when callers construct PointReads externally.\n if (entry.expectedCommitTs === undefined) continue;\n\n const bucket = byTable.get(entry.table);\n if (bucket) bucket.push({ entry, key });\n else byTable.set(entry.table, [{ entry, key }]);\n }\n\n for (const [table, pendings] of byTable) {\n const ids = pendings.map((p) => p.entry.id);\n const placeholders = ids.map(() => \"?\").join(\", \");\n\n result.push({\n sql: `SELECT id, commit_ts FROM ${table} WHERE id IN (${placeholders})`,\n params: ids,\n table: table,\n operation: 'pointReadValidation',\n pendingsEntry: pendings,\n });\n }\n\n return result;\n }\n\n async commitWrites(\n beginTs: bigint,\n queries: PreparedQueries,\n commitTs: bigint,\n ): Promise<{ success: boolean }> {\n await this.mysqlApplyWrites(queries.commits);\n\n // Fast path: when the readSet has no range reads, we don't need a\n // commit-log scan at all — point reads validate via per-row commit_ts,\n // and writes already self-validated via CAS above. This is the dominant\n // shape (most mutations target known ids) and eliminates the heaviest\n // OCC cost in the previous design.\n if (!queries.hasRangeRead) {\n if ((queries.validateReadPoints?.length ?? 0) > 0) {\n await this.validatePointReadsByCommitTs(queries.validateReadPoints ?? []);\n }\n return { success: true };\n }\n\n // Slow path: at least one range read present. Fall back to the\n // commit-log scan so phantom inserts and predicate transitions-in are\n // still caught. Point reads in the same set are covered by the same\n // scan, so no separate validation is needed.\n const logs = await this.getCommitLogsSinceTs(beginTs, commitTs, queries.tableIds ?? []);\n const hasConflict = checkLogsAffectReadSet(logs, queries.rawReadSet ?? []);\n if (hasConflict) {\n throw new OccConflictError(\n `Conflict detected: overlapping commit logs since ${beginTs}`,\n { logs }\n );\n }\n\n return { success: true };\n }\n\n // Walks the writeSet in order and coalesces consecutive entries with the\n // same (table, op) into one batched statement. Order is preserved across\n // batch boundaries so replace-patterns (delete-then-insert of the same\n // id) behave identically to the per-row code path. Single-row batches\n // take a direct INSERT/UPDATE/DELETE fast-path to avoid the unnest+join\n // overhead, which matters under high contention.\n private async mysqlApplyWrites(result: PreparedQuery[]): Promise<void> {\n for (const q of result) {\n switch (q.operation) {\n case 'insertBatch': {\n try {\n await this.query(q.sql, q.params);\n } catch (err) {\n if (\n err && typeof err === \"object\" &&\n ((err as { errno?: number }).errno === 1062 ||\n (err as { code?: string }).code === \"ER_DUP_ENTRY\")\n ) {\n const msg = (err as { message?: string }).message ?? \"\";\n const idMatch = msg.match(/key '[^']+'.*?\\(.*?\\)=\\(?([^,\\)]+)/);\n const failedId = idMatch?.[1];\n throw new OccConflictError(\n failedId !== undefined\n ? `Conflict: insert into ${q.table}/${failedId} hit duplicate key`\n : `Conflict: batch insert into ${q.table} hit duplicate key`,\n err,\n );\n }\n throw err;\n }\n break;\n }\n case 'updateSingle': {\n const result = await this.query(q.sql, q.params);\n if ((result.rowCount ?? 0) === 0) {\n throw new OccConflictError(\n `Conflict: CAS update of ${q.table}/${q.entryId} (expected commit_ts=${q.expectedTs}) matched no rows`,\n { table: q.table, id: q.entryId, expected: q.expectedTs },\n );\n }\n break;\n }\n case 'deleteBatch': {\n const result = await this.query(q.sql, q.params);\n if ((result.rowCount ?? 0) === 0) {\n throw new OccConflictError(\n `Conflict: CAS delete of ${q.table}/${q.entryId} (expected commit_ts=${q.expectedTs}) matched no rows`,\n { table: q.table, id: q.entryId, expected: q.expectedTs },\n );\n }\n break;\n }\n case 'commit_logs': {\n await this.query(q.sql, q.params);\n break;\n }\n default:\n throw new Error(\"Unhandled MySQL Operation: \" + q.operation);\n\n }\n }\n }\n\n private async validatePointReadsByCommitTs(queries: PreparedQuery[]): Promise<void> {\n\n for (const q of queries) {\n const result = await this.query<{ id: string; commit_ts: string | number | bigint }>(q.sql, q.params);\n\n const currentById = new Map<string, bigint>();\n for (const row of result.rows) {\n currentById.set(String(row.id), BigInt(row.commit_ts));\n }\n\n for (const { entry } of q.pendingsEntry ?? []) {\n const current = currentById.get(String(entry.id));\n const expected = entry.expectedCommitTs;\n\n if (expected === null) {\n // We read \"no row\"; conflict if a row now exists.\n if (current !== undefined) {\n throw new OccConflictError(\n `Conflict: row ${entry.table}/${entry.id} was inserted concurrently`,\n { table: entry.table, id: entry.id }\n );\n }\n } else {\n if (current === undefined) {\n throw new OccConflictError(\n `Conflict: row ${entry.table}/${entry.id} was deleted concurrently`,\n { table: entry.table, id: entry.id, expected }\n );\n }\n if (current !== expected) {\n throw new OccConflictError(\n `Conflict: row ${entry.table}/${entry.id} changed from ts=${expected} to ts=${current}`,\n { table: entry.table, id: entry.id, expected, current }\n );\n }\n }\n }\n }\n }\n\n async pruneCommitLogsBefore(ts: bigint): Promise<bigint> {\n const result = await this.query(\n `DELETE FROM commit_logs WHERE ts < ?`,\n [ts]\n );\n return BigInt(result.rowCount ?? 0);\n }\n\n async getCommitLogsBetweenTs(beginTs: bigint, endTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]> {\n if (tableIds.length === 0) return [];\n\n const placeholders = tableIds.map(() => '?').join(\", \");\n const sql = `SELECT id, ts, table_id, data FROM commit_logs WHERE ts >= ? AND ts < ? AND table_id IN (${placeholders})`;\n\n const result = await this.query<{ id: unknown; ts: string | number | bigint; table_id: unknown; data: unknown }>(\n sql,\n [beginTs, endTs, ...tableIds.map(toBufferView)]\n );\n\n return result.rows.map((row) => ({\n id: normalizeToBytes(row.id),\n ts: BigInt(row.ts),\n tableId: normalizeToBytes(row.table_id),\n data: normalizeToBytes(row.data),\n }));\n }\n\n async getCommitLogsSinceTs(sinceTs: bigint, excludeTs: bigint, tableIds: Uint8Array[]): Promise<CommitLogEntry[]> {\n if (tableIds.length === 0) return [];\n\n const placeholders = tableIds.map(() => '?').join(\", \");\n const sql = `SELECT id, ts, table_id, data FROM commit_logs WHERE ts >= ? AND ts <> ? AND table_id IN (${placeholders})`;\n\n const result = await this.query<{ id: unknown; ts: string | number | bigint; table_id: unknown; data: unknown }>(\n sql,\n [sinceTs, excludeTs, ...tableIds.map(toBufferView)]\n );\n\n return result.rows.map((row) => ({\n id: normalizeToBytes(row.id),\n ts: BigInt(row.ts),\n tableId: normalizeToBytes(row.table_id),\n data: normalizeToBytes(row.data),\n }));\n }\n\n async close(): Promise<void> {\n await this.pool.end();\n }\n}\n\nexport class MySqlTxDatabase extends MySqlDatabase {\n constructor(logger: Logger, config: MySqlPoolOptions, pool: Pool, client: PoolConnection & QueryConnection) {\n super(logger, config, pool);\n this.client = client;\n }\n\n private client: PoolConnection & QueryConnection;\n\n async query<T = any>(sql: string, params: unknown[] = []): Promise<DbQueryResult<T>> {\n try {\n const [rows] = this.queryTimeoutMs > 0\n ? await this.client.query({ sql, values: params as any[], timeout: this.queryTimeoutMs })\n : await this.client.query(sql, params as any[]);\n return normalizeMysqlResult<T>(rows);\n } catch (err) {\n throw translateMysqlError(err);\n }\n }\n\n async begin(): Promise<void> {\n await this.client.beginTransaction();\n }\n\n async commit(): Promise<void> {\n await this.client.commit();\n }\n\n async rollback(): Promise<void> {\n await this.client.rollback();\n }\n\n release(): void {\n this.client.release();\n }\n}\n\n/**\n * MySQL InnoDB deadlock (errno 1213 / SQLSTATE 40001) is transient and\n * semantically equivalent to an OCC conflict from the mutation runner's\n * perspective: re-execute the handler with a fresh snapshot. Wrapping\n * here lets realtime_db.ts stay driver-agnostic — its retry loop already\n * handles OccConflictError.\n */\nfunction translateMysqlError(err: unknown): unknown {\n if (\n err && typeof err === \"object\" &&\n ((err as { errno?: number }).errno === 1213 ||\n (err as { code?: string }).code === \"ER_LOCK_DEADLOCK\")\n ) {\n return new OccConflictError(\"deadlock detected\", err);\n }\n return err;\n}\n\nconst mysqlSql: SqlBuilder = {\n placeholder: (i) => `?`,\n like: (col, i) => `${col} LIKE ?`,\n ilike: (col, i) => `${col} LIKE ?`, // MySQL doesn't have ILIKE\n icontains: (col, i) => `${col} LIKE ?`,\n // CAST(? AS JSON) lets the driver bind the param as a regular string\n // (JSON-serialized client-side) and MySQL re-parses it into a JSON value\n // for containment comparison. When a sub-path is set, JSON_CONTAINS takes\n // the path as its third argument.\n jsonContains: (col, _i, opts) => opts?.pathIndex !== undefined\n ? `JSON_CONTAINS(${col}, CAST(? AS JSON), ?)`\n : `JSON_CONTAINS(${col}, CAST(? AS JSON))`,\n jsonContainedBy: (col, _i, opts) => opts?.pathIndex !== undefined\n // For \"is the column contained in the candidate at this sub-path of the\n // column\" we still need to extract the sub-path from the column side.\n // JSON_CONTAINS's path arg is on the TARGET position, so we flip and use\n // JSON_EXTRACT for the column side instead.\n ? `JSON_CONTAINS(CAST(? AS JSON), JSON_EXTRACT(${col}, ?))`\n : `JSON_CONTAINS(CAST(? AS JSON), ${col})`,\n jsonHasKey: (col, _i, opts) => {\n if (opts?.pathCount && opts.pathCount > 0) {\n const mode = opts.mode === \"all\" ? \"'all'\" : \"'one'\";\n const places = new Array(opts.pathCount).fill(\"?\").join(\", \");\n return `JSON_CONTAINS_PATH(${col}, ${mode}, ${places})`;\n }\n return opts?.raw\n // Param is already a JSON path expression like `$.foo.bar` or `$.\"a\".\"b\"`.\n ? `JSON_CONTAINS_PATH(${col}, 'one', ?)`\n // Param is a literal top-level key. Wrap it in `$.\"<key>\"` server-side\n // and escape any embedded double-quotes so dotted keys behave as keys\n // and not nested paths.\n : `JSON_CONTAINS_PATH(${col}, 'one', CONCAT('$.\"', REPLACE(?, '\"', '\\\\\\\\\"'), '\"'))`;\n },\n jsonArrayContains: (col, _i, opts) => opts?.pathIndex !== undefined\n ? `JSON_CONTAINS(${col}, JSON_ARRAY(CAST(? AS JSON)), ?)`\n : `JSON_CONTAINS(${col}, JSON_ARRAY(CAST(? AS JSON)))`,\n};\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as
|
|
3
|
-
import { C as normalizeIdToBytes } from "./types_db-
|
|
1
|
+
import { n as utf8Decode, t as bytesEqual } from "./bytes-AuEkyxeU.js";
|
|
2
|
+
import { a as jsonPathExtract, i as jsonPathExists, r as jsonContains } from "./query-Bh0RNxDz.js";
|
|
3
|
+
import { C as normalizeIdToBytes } from "./types_db-DXj_l9n-.js";
|
|
4
4
|
//#region src/server/overlap-checker.ts
|
|
5
5
|
function mapReadEntryToRaw(entry) {
|
|
6
6
|
if (entry.kind === "point") return {
|
|
@@ -184,4 +184,4 @@ function checkRowWriteAffectsRange(op, prevData, data, predicate) {
|
|
|
184
184
|
//#endregion
|
|
185
185
|
export { mapWriteSetToRaw as i, checkWriteSetAffectsReadSet as n, mapReadSetToRaw as r, checkLogsAffectReadSet as t };
|
|
186
186
|
|
|
187
|
-
//# sourceMappingURL=overlap-checker-
|
|
187
|
+
//# sourceMappingURL=overlap-checker-Ct_HP_iB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlap-checker-CVkbbuEQ.js","names":[],"sources":["../src/server/overlap-checker.ts"],"sourcesContent":["import type {\n ReadEntry, CommitLogEntry,\n Predicate, WriteEntry, WriteOp,\n RawReadEntry, RawPointRead, RawRangeRead, LeafPredicate,\n} from \"../db/types_db\";\nimport { normalizeIdToBytes } from \"../db/types_db\";\nimport { bytesEqual, utf8Decode } from \"../db/bytes\";\nimport { jsonContains, jsonPathExists, jsonPathExtract } from \"../db/query\";\n\nexport interface RawWriteEntry {\n table: string;\n tableId: Uint8Array;\n id: Uint8Array;\n op: WriteOp;\n data?: Record<string, unknown>;\n prevData?: Record<string, unknown>;\n}\n\nexport function mapReadEntryToRaw(entry: ReadEntry): RawReadEntry {\n if (entry.kind === \"point\") {\n return {\n kind: \"point\",\n tableId: entry.tableId,\n id: normalizeIdToBytes(entry.id),\n table: entry.table,\n };\n } else {\n return {\n kind: \"range\",\n tableId: entry.tableId,\n table: entry.table,\n predicate: entry.predicate,\n columns: entry.columns,\n offset: entry.offset,\n orderBy: entry.orderBy,\n limit: entry.limit,\n };\n }\n}\n\nexport function mapReadSetToRaw(readSet: ReadEntry[]): RawReadEntry[] {\n return readSet.map(mapReadEntryToRaw);\n}\n\nexport function mapWriteEntryToRaw(entry: WriteEntry): RawWriteEntry {\n return {\n table: entry.table,\n tableId: entry.tableId,\n id: normalizeIdToBytes(entry.id),\n op: entry.op,\n data: entry.data,\n prevData: entry.prevData,\n };\n}\n\nexport function mapWriteSetToRaw(writeSet: WriteEntry[]): RawWriteEntry[] {\n return writeSet.map(mapWriteEntryToRaw);\n}\n\nexport type OverlapVerdict = \"yes\" | \"no\" | \"unknown\";\n\nexport function evaluatePredicateAgainstRow(\n rowData: Record<string, unknown>,\n predicate: Predicate\n): OverlapVerdict {\n switch (predicate.kind) {\n case \"and\": {\n let hasUnknown = false;\n for (const child of predicate.children) {\n const r = evaluatePredicateAgainstRow(rowData, child);\n if (r === \"no\") return \"no\";\n if (r === \"unknown\") hasUnknown = true;\n }\n return hasUnknown ? \"unknown\" : \"yes\";\n }\n case \"or\": {\n let hasUnknown = false;\n for (const child of predicate.children) {\n const r = evaluatePredicateAgainstRow(rowData, child);\n if (r === \"yes\") return \"yes\";\n if (r === \"unknown\") hasUnknown = true;\n }\n return hasUnknown ? \"unknown\" : \"no\";\n }\n case \"leaf\": {\n if (!(predicate.column in rowData)) return \"unknown\";\n const val = rowData[predicate.column];\n switch (predicate.operator) {\n case \"=\": return val === predicate.value ? \"yes\" : \"no\";\n case \"!=\": return val !== predicate.value ? \"yes\" : \"no\";\n case \">\": return (val as number) > (predicate.value as number) ? \"yes\" : \"no\";\n case \">=\": return (val as number) >= (predicate.value as number) ? \"yes\" : \"no\";\n case \"<\": return (val as number) < (predicate.value as number) ? \"yes\" : \"no\";\n case \"<=\": return (val as number) <= (predicate.value as number) ? \"yes\" : \"no\";\n case \"between\":\n return (val as number) >= (predicate.value as number) &&\n (val as number) <= (predicate.value2 as number) ? \"yes\" : \"no\";\n case \"like\":\n case \"contains\":\n case \"ilike\":\n case \"icontains\": {\n if (typeof val !== \"string\" || typeof predicate.value !== \"string\") return \"no\";\n const haystack = (predicate.operator === \"ilike\" || predicate.operator === \"icontains\")\n ? val.toLowerCase() : val;\n const needle = (predicate.operator === \"ilike\" || predicate.operator === \"icontains\")\n ? (predicate.value as string).toLowerCase() : predicate.value as string;\n const pattern = (predicate.operator === \"contains\" || predicate.operator === \"icontains\")\n ? `%${needle}%` : needle;\n const regex = new RegExp(\"^\" + pattern.replace(/%/g, \".*\").replace(/_/g, \".\") + \"$\");\n return regex.test(haystack) ? \"yes\" : \"no\";\n }\n case \"jsonContains\": {\n const candidate = decodeJsonLeafValue(predicate);\n const target = predicate.path !== undefined ? jsonPathExtract(val, predicate.path) : val;\n if (target === undefined) return \"no\";\n return jsonContains(target, candidate) ? \"yes\" : \"no\";\n }\n case \"jsonContainedBy\": {\n const candidate = decodeJsonLeafValue(predicate);\n const target = predicate.path !== undefined ? jsonPathExtract(val, predicate.path) : val;\n if (target === undefined) return \"no\";\n return jsonContains(candidate, target) ? \"yes\" : \"no\";\n }\n case \"jsonHasKey\": {\n if (predicate.mode && Array.isArray(predicate.value)) {\n const paths = predicate.value as string[];\n if (paths.length === 0) return \"no\";\n const verdict = predicate.mode === \"all\"\n ? paths.every(p => jsonPathExists(val, p))\n : paths.some(p => jsonPathExists(val, p));\n return verdict ? \"yes\" : \"no\";\n }\n if (predicate.raw) {\n return jsonPathExists(val, predicate.value as string) ? \"yes\" : \"no\";\n }\n const key = predicate.value as string;\n if (val === null || typeof val !== \"object\") return \"no\";\n if (Array.isArray(val)) return (val as unknown[]).includes(key) ? \"yes\" : \"no\";\n return key in (val as object) ? \"yes\" : \"no\";\n }\n case \"jsonArrayContains\": {\n const candidate = decodeJsonLeafValue(predicate);\n const target = predicate.path !== undefined ? jsonPathExtract(val, predicate.path) : val;\n if (!Array.isArray(target)) return \"no\";\n return (target as unknown[]).some(el => jsonContains(el, candidate)) ? \"yes\" : \"no\";\n }\n case \"isNull\": return val === null ? \"yes\" : \"no\";\n case \"isNotNull\": return val !== null ? \"yes\" : \"no\";\n default: return \"unknown\";\n }\n }\n }\n}\n\nfunction decodeJsonLeafValue(leaf: LeafPredicate): unknown {\n if (!leaf.raw) return leaf.value;\n if (typeof leaf.value !== \"string\") return leaf.value;\n try { return JSON.parse(leaf.value); } catch { return leaf.value; }\n}\n\nfunction parseLogData(log: CommitLogEntry): Record<string, unknown> | null {\n if (log._parsedData !== undefined) {\n return log._parsedData;\n }\n const data = log.data.length > 0\n ? JSON.parse(utf8Decode(log.data)) as Record<string, unknown>\n : null;\n log._parsedData = data;\n return data;\n}\n\n\nexport function checkLogsAffectReadSet(\n logs: CommitLogEntry[],\n rawReadSet: RawReadEntry[]\n): boolean {\n for (const log of logs) {\n for (const rawRead of rawReadSet) {\n if (!bytesEqual(log.tableId, rawRead.tableId)) continue;\n\n const res = rawRead.kind === \"point\" ?\n checkPointReadOverlap(log, rawRead) :\n checkRangeReadOverlap(log, rawRead);\n\n if (res) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction checkPointReadOverlap(\n log: CommitLogEntry,\n rawRead: RawPointRead,\n): boolean {\n return bytesEqual(log.id, rawRead.id);\n}\n\nfunction checkRangeReadOverlap(\n log: CommitLogEntry,\n rawRead: RawRangeRead\n): boolean {\n const logData = parseLogData(log);\n\n // No envelope at all → can't reason, must conflict-out.\n if (!logData) { \n return true;\n }\n\n // Commit logs serialize the full WriteEntry (see PgDatabase.insertCommitLogs),\n // so extract the row state from it. Same prev-OR-post check as the\n // in-memory invalidator path.\n const op = (logData.op as WriteOp | undefined) ?? \"update\";\n const data = logData.data as Record<string, unknown> | undefined;\n const prevData = logData.prevData as Record<string, unknown> | undefined;\n\n return checkRowWriteAffectsRange(op, prevData, data, rawRead.predicate);\n}\n\nexport function checkWriteSetAffectsReadSet(\n writeSet: RawWriteEntry[],\n rawReadSet: RawReadEntry[]\n): boolean {\n for (const write of writeSet) {\n for (const rawRead of rawReadSet) {\n if (!bytesEqual(write.tableId, rawRead.tableId)) continue;\n\n if (checkWriteAffectsRawReadEntry(write, rawRead)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction checkWriteAffectsRawReadEntry(\n write: RawWriteEntry,\n rawRead: RawReadEntry\n): boolean {\n if (rawRead.kind === \"point\") {\n return bytesEqual(write.id, rawRead.id);\n }\n return checkRowWriteAffectsRange(\n write.op,\n write.prevData,\n write.data,\n rawRead.predicate,\n );\n}\n\n/**\n * Evaluate whether a write affects a range subscription, given the row's\n * prior and post state. The write is considered affecting if EITHER side\n * matched the predicate — that catches:\n * - rows entering the result set (prev \"no\", post \"yes\")\n * - rows leaving the result set (prev \"yes\", post \"no\")\n * - rows changing while still in the set (prev \"yes\", post \"yes\")\n * Skipped only if both sides are a definite \"no\".\n *\n * When prevData is missing (e.g. inserts, or commit logs predating this\n * change), we fall back to conservative \"unknown\" on that side.\n */\nfunction checkRowWriteAffectsRange(\n op: WriteOp,\n prevData: Record<string, unknown> | undefined,\n data: Record<string, unknown> | undefined,\n predicate: RawRangeRead[\"predicate\"],\n): boolean {\n const prevVerdict: OverlapVerdict = prevData\n ? evaluatePredicateAgainstRow(prevData, predicate)\n : (op === \"insert\" ? \"no\" : \"unknown\");\n\n let postVerdict: OverlapVerdict;\n if (op === \"delete\") {\n postVerdict = \"no\";\n } else if (data) {\n // Merge over prevData so unchanged columns carry over — otherwise a\n // partial update (e.g. {title: \"x\"}) would be \"unknown\" on every\n // predicate column it doesn't touch.\n const post = prevData ? { ...prevData, ...data } : data;\n postVerdict = evaluatePredicateAgainstRow(post, predicate);\n } else {\n postVerdict = \"unknown\";\n }\n\n return prevVerdict !== \"no\" || postVerdict !== \"no\";\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"overlap-checker-Ct_HP_iB.js","names":[],"sources":["../src/server/overlap-checker.ts"],"sourcesContent":["import type {\n ReadEntry, CommitLogEntry,\n Predicate, WriteEntry, WriteOp,\n RawReadEntry, RawPointRead, RawRangeRead, LeafPredicate,\n} from \"../db/types_db\";\nimport { normalizeIdToBytes } from \"../db/types_db\";\nimport { bytesEqual, utf8Decode } from \"../db/bytes\";\nimport { jsonContains, jsonPathExists, jsonPathExtract } from \"../db/query\";\n\nexport interface RawWriteEntry {\n table: string;\n tableId: Uint8Array;\n id: Uint8Array;\n op: WriteOp;\n data?: Record<string, unknown>;\n prevData?: Record<string, unknown>;\n}\n\nexport function mapReadEntryToRaw(entry: ReadEntry): RawReadEntry {\n if (entry.kind === \"point\") {\n return {\n kind: \"point\",\n tableId: entry.tableId,\n id: normalizeIdToBytes(entry.id),\n table: entry.table,\n };\n } else {\n return {\n kind: \"range\",\n tableId: entry.tableId,\n table: entry.table,\n predicate: entry.predicate,\n columns: entry.columns,\n offset: entry.offset,\n orderBy: entry.orderBy,\n limit: entry.limit,\n };\n }\n}\n\nexport function mapReadSetToRaw(readSet: ReadEntry[]): RawReadEntry[] {\n return readSet.map(mapReadEntryToRaw);\n}\n\nexport function mapWriteEntryToRaw(entry: WriteEntry): RawWriteEntry {\n return {\n table: entry.table,\n tableId: entry.tableId,\n id: normalizeIdToBytes(entry.id),\n op: entry.op,\n data: entry.data,\n prevData: entry.prevData,\n };\n}\n\nexport function mapWriteSetToRaw(writeSet: WriteEntry[]): RawWriteEntry[] {\n return writeSet.map(mapWriteEntryToRaw);\n}\n\nexport type OverlapVerdict = \"yes\" | \"no\" | \"unknown\";\n\nexport function evaluatePredicateAgainstRow(\n rowData: Record<string, unknown>,\n predicate: Predicate\n): OverlapVerdict {\n switch (predicate.kind) {\n case \"and\": {\n let hasUnknown = false;\n for (const child of predicate.children) {\n const r = evaluatePredicateAgainstRow(rowData, child);\n if (r === \"no\") return \"no\";\n if (r === \"unknown\") hasUnknown = true;\n }\n return hasUnknown ? \"unknown\" : \"yes\";\n }\n case \"or\": {\n let hasUnknown = false;\n for (const child of predicate.children) {\n const r = evaluatePredicateAgainstRow(rowData, child);\n if (r === \"yes\") return \"yes\";\n if (r === \"unknown\") hasUnknown = true;\n }\n return hasUnknown ? \"unknown\" : \"no\";\n }\n case \"leaf\": {\n if (!(predicate.column in rowData)) return \"unknown\";\n const val = rowData[predicate.column];\n switch (predicate.operator) {\n case \"=\": return val === predicate.value ? \"yes\" : \"no\";\n case \"!=\": return val !== predicate.value ? \"yes\" : \"no\";\n case \">\": return (val as number) > (predicate.value as number) ? \"yes\" : \"no\";\n case \">=\": return (val as number) >= (predicate.value as number) ? \"yes\" : \"no\";\n case \"<\": return (val as number) < (predicate.value as number) ? \"yes\" : \"no\";\n case \"<=\": return (val as number) <= (predicate.value as number) ? \"yes\" : \"no\";\n case \"between\":\n return (val as number) >= (predicate.value as number) &&\n (val as number) <= (predicate.value2 as number) ? \"yes\" : \"no\";\n case \"like\":\n case \"contains\":\n case \"ilike\":\n case \"icontains\": {\n if (typeof val !== \"string\" || typeof predicate.value !== \"string\") return \"no\";\n const haystack = (predicate.operator === \"ilike\" || predicate.operator === \"icontains\")\n ? val.toLowerCase() : val;\n const needle = (predicate.operator === \"ilike\" || predicate.operator === \"icontains\")\n ? (predicate.value as string).toLowerCase() : predicate.value as string;\n const pattern = (predicate.operator === \"contains\" || predicate.operator === \"icontains\")\n ? `%${needle}%` : needle;\n const regex = new RegExp(\"^\" + pattern.replace(/%/g, \".*\").replace(/_/g, \".\") + \"$\");\n return regex.test(haystack) ? \"yes\" : \"no\";\n }\n case \"jsonContains\": {\n const candidate = decodeJsonLeafValue(predicate);\n const target = predicate.path !== undefined ? jsonPathExtract(val, predicate.path) : val;\n if (target === undefined) return \"no\";\n return jsonContains(target, candidate) ? \"yes\" : \"no\";\n }\n case \"jsonContainedBy\": {\n const candidate = decodeJsonLeafValue(predicate);\n const target = predicate.path !== undefined ? jsonPathExtract(val, predicate.path) : val;\n if (target === undefined) return \"no\";\n return jsonContains(candidate, target) ? \"yes\" : \"no\";\n }\n case \"jsonHasKey\": {\n if (predicate.mode && Array.isArray(predicate.value)) {\n const paths = predicate.value as string[];\n if (paths.length === 0) return \"no\";\n const verdict = predicate.mode === \"all\"\n ? paths.every(p => jsonPathExists(val, p))\n : paths.some(p => jsonPathExists(val, p));\n return verdict ? \"yes\" : \"no\";\n }\n if (predicate.raw) {\n return jsonPathExists(val, predicate.value as string) ? \"yes\" : \"no\";\n }\n const key = predicate.value as string;\n if (val === null || typeof val !== \"object\") return \"no\";\n if (Array.isArray(val)) return (val as unknown[]).includes(key) ? \"yes\" : \"no\";\n return key in (val as object) ? \"yes\" : \"no\";\n }\n case \"jsonArrayContains\": {\n const candidate = decodeJsonLeafValue(predicate);\n const target = predicate.path !== undefined ? jsonPathExtract(val, predicate.path) : val;\n if (!Array.isArray(target)) return \"no\";\n return (target as unknown[]).some(el => jsonContains(el, candidate)) ? \"yes\" : \"no\";\n }\n case \"isNull\": return val === null ? \"yes\" : \"no\";\n case \"isNotNull\": return val !== null ? \"yes\" : \"no\";\n default: return \"unknown\";\n }\n }\n }\n}\n\nfunction decodeJsonLeafValue(leaf: LeafPredicate): unknown {\n if (!leaf.raw) return leaf.value;\n if (typeof leaf.value !== \"string\") return leaf.value;\n try { return JSON.parse(leaf.value); } catch { return leaf.value; }\n}\n\nfunction parseLogData(log: CommitLogEntry): Record<string, unknown> | null {\n if (log._parsedData !== undefined) {\n return log._parsedData;\n }\n const data = log.data.length > 0\n ? JSON.parse(utf8Decode(log.data)) as Record<string, unknown>\n : null;\n log._parsedData = data;\n return data;\n}\n\n\nexport function checkLogsAffectReadSet(\n logs: CommitLogEntry[],\n rawReadSet: RawReadEntry[]\n): boolean {\n for (const log of logs) {\n for (const rawRead of rawReadSet) {\n if (!bytesEqual(log.tableId, rawRead.tableId)) continue;\n\n const res = rawRead.kind === \"point\" ?\n checkPointReadOverlap(log, rawRead) :\n checkRangeReadOverlap(log, rawRead);\n\n if (res) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction checkPointReadOverlap(\n log: CommitLogEntry,\n rawRead: RawPointRead,\n): boolean {\n return bytesEqual(log.id, rawRead.id);\n}\n\nfunction checkRangeReadOverlap(\n log: CommitLogEntry,\n rawRead: RawRangeRead\n): boolean {\n const logData = parseLogData(log);\n\n // No envelope at all → can't reason, must conflict-out.\n if (!logData) { \n return true;\n }\n\n // Commit logs serialize the full WriteEntry (see PgDatabase.insertCommitLogs),\n // so extract the row state from it. Same prev-OR-post check as the\n // in-memory invalidator path.\n const op = (logData.op as WriteOp | undefined) ?? \"update\";\n const data = logData.data as Record<string, unknown> | undefined;\n const prevData = logData.prevData as Record<string, unknown> | undefined;\n\n return checkRowWriteAffectsRange(op, prevData, data, rawRead.predicate);\n}\n\nexport function checkWriteSetAffectsReadSet(\n writeSet: RawWriteEntry[],\n rawReadSet: RawReadEntry[]\n): boolean {\n for (const write of writeSet) {\n for (const rawRead of rawReadSet) {\n if (!bytesEqual(write.tableId, rawRead.tableId)) continue;\n\n if (checkWriteAffectsRawReadEntry(write, rawRead)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction checkWriteAffectsRawReadEntry(\n write: RawWriteEntry,\n rawRead: RawReadEntry\n): boolean {\n if (rawRead.kind === \"point\") {\n return bytesEqual(write.id, rawRead.id);\n }\n return checkRowWriteAffectsRange(\n write.op,\n write.prevData,\n write.data,\n rawRead.predicate,\n );\n}\n\n/**\n * Evaluate whether a write affects a range subscription, given the row's\n * prior and post state. The write is considered affecting if EITHER side\n * matched the predicate — that catches:\n * - rows entering the result set (prev \"no\", post \"yes\")\n * - rows leaving the result set (prev \"yes\", post \"no\")\n * - rows changing while still in the set (prev \"yes\", post \"yes\")\n * Skipped only if both sides are a definite \"no\".\n *\n * When prevData is missing (e.g. inserts, or commit logs predating this\n * change), we fall back to conservative \"unknown\" on that side.\n */\nfunction checkRowWriteAffectsRange(\n op: WriteOp,\n prevData: Record<string, unknown> | undefined,\n data: Record<string, unknown> | undefined,\n predicate: RawRangeRead[\"predicate\"],\n): boolean {\n const prevVerdict: OverlapVerdict = prevData\n ? evaluatePredicateAgainstRow(prevData, predicate)\n : (op === \"insert\" ? \"no\" : \"unknown\");\n\n let postVerdict: OverlapVerdict;\n if (op === \"delete\") {\n postVerdict = \"no\";\n } else if (data) {\n // Merge over prevData so unchanged columns carry over — otherwise a\n // partial update (e.g. {title: \"x\"}) would be \"unknown\" on every\n // predicate column it doesn't touch.\n const post = prevData ? { ...prevData, ...data } : data;\n postVerdict = evaluatePredicateAgainstRow(post, predicate);\n } else {\n postVerdict = \"unknown\";\n }\n\n return prevVerdict !== \"no\" || postVerdict !== \"no\";\n}"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { r as utf8Encode } from "./bytes-AuEkyxeU.js";
|
|
2
|
+
import { r as supaliveStringify } from "./helper-wGbzz6zo.js";
|
|
3
|
+
import { C as normalizeIdToBytes, l as OccConflictError, w as normalizeToBytes } from "./types_db-DXj_l9n-.js";
|
|
4
|
+
import { r as mapReadSetToRaw, t as checkLogsAffectReadSet } from "./overlap-checker-Ct_HP_iB.js";
|
|
4
5
|
import { Pool } from "pg";
|
|
5
6
|
//#region src/db/postgres.ts
|
|
6
7
|
function toBufferView(bytes) {
|
|
@@ -820,4 +821,4 @@ const pgSql = {
|
|
|
820
821
|
//#endregion
|
|
821
822
|
export { PgDatabase as t };
|
|
822
823
|
|
|
823
|
-
//# sourceMappingURL=postgres-
|
|
824
|
+
//# sourceMappingURL=postgres-B8u1YN8X.js.map
|