@laboverwire/stitch 0.4.3 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/README.md +8 -5
- package/dist/index.d.ts +1 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +1 -1
- package/dist/react/provider.d.ts +2 -2
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/store.d.ts +2 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +190 -724
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +23 -161
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -6
- package/dist/types.js.map +1 -1
- package/package.json +23 -14
- package/dist/internal-utils.d.ts +0 -4
- package/dist/internal-utils.d.ts.map +0 -1
- package/dist/internal-utils.js +0 -20
- package/dist/internal-utils.js.map +0 -1
- package/dist/internal-wasm-error.d.ts +0 -9
- package/dist/internal-wasm-error.d.ts.map +0 -1
- package/dist/internal-wasm-error.js +0 -48
- package/dist/internal-wasm-error.js.map +0 -1
- package/dist/memory-store.d.ts +0 -3
- package/dist/memory-store.d.ts.map +0 -1
- package/dist/memory-store.js +0 -572
- package/dist/memory-store.js.map +0 -1
- package/dist/offline-queue.d.ts +0 -6
- package/dist/offline-queue.d.ts.map +0 -1
- package/dist/offline-queue.js +0 -363
- package/dist/offline-queue.js.map +0 -1
- package/dist/persistence-layer.d.ts +0 -7
- package/dist/persistence-layer.d.ts.map +0 -1
- package/dist/persistence-layer.js +0 -409
- package/dist/persistence-layer.js.map +0 -1
- package/dist/remote-sync-layer.d.ts +0 -8
- package/dist/remote-sync-layer.d.ts.map +0 -1
- package/dist/remote-sync-layer.js +0 -439
- package/dist/remote-sync-layer.js.map +0 -1
- package/dist/sync-engine.d.ts +0 -3
- package/dist/sync-engine.d.ts.map +0 -1
- package/dist/sync-engine.js +0 -643
- package/dist/sync-engine.js.map +0 -1
package/dist/sync-engine.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../src/sync-engine.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAe5C,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,SAAS,eAAe,CACtB,WAAgD,EAChD,MAA0B;IAE1B,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,WAAW,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACzC,WAAW,CAAC,kBAAkB,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,cAAc;IACV,MAAM,GAAsB,IAAI,CAAC;IACxB,QAAQ,CAAS;IACjB,MAAM,CAAc;IACpB,MAAM,CAAS;IACf,cAAc,CAAS;IAChC,gBAAgB,GAAwC,IAAI,CAAC;IAC7D,cAAc,GAAsC,IAAI,CAAC;IACzD,cAAc,GAA2D,IAAI,CAAC;IAE9E,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC7C,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,eAAe,GAAG,IAAI,GAAG,EAG9B,CAAC;IAEI,kBAAkB,GAAG,KAAK,CAAC;IAE3B,UAAU,GAA2B,IAAI,CAAC;IAC1C,kBAAkB,GAAmC,IAAI,CAAC;IAC1D,gBAAgB,GAAwB,IAAI,CAAC;IAC7C,SAAS,GAAmC,IAAI,CAAC;IACjD,MAAM,GAAG,KAAK,CAAC;IACf,cAAc,GAAyC,IAAI,CAAC;IAC5D,gBAAgB,GAAG,CAAC,CAAC;IACrB,YAAY,GAAG,KAAK,CAAC;IACrB,gBAAgB,GAAG,KAAK,CAAC;IACzB,SAAS,GAAkB,IAAI,CAAC;IAExC,YAAY,QAAgB,EAAE,MAAmB;QAC/C,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,mBAAmB,IAAI,gBAAgB,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,OAAO,CACX,SAAiB,EACjB,UAAmB,EACnB,SAAiC;QAEjC,IAAI,CAAC,kBAAkB,EAAE,CAAC,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,UAAyC,CAAC;YACtD,MAAM,EACJ,OAAO,EAAE,YAAY,EACrB,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,GAAG,GAAG,CAAC;YACR,MAAM,YAAY,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;YACzC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YACrC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YAErC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE;gBACzB,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACzB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;gBAC1B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;gBAC9B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;qBACvE,IAAI,CAAC,GAAG,EAAE;oBACT,IAAI,IAAI,CAAC,MAAM;wBAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,WAAW,CAAC,CAAC;oBACxD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBACzC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;6BAC3B,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;6BAC9C,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;oBACxF,CAAC;gBACH,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;oBAClE,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,CAAC;oBACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACzB,IAAI,IAAI,CAAC,YAAY;oBAAE,OAAO;gBAC9B,IAAI,CAAC,kBAAkB,EAAE,CAAC,cAAc,CAAC,CAAC;gBAC1C,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC;oBACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;gBACpC,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACzB,IAAI,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO;gBAC3D,IAAI,kEAAkE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnF,IAAI,CAAC,eAAe,EAAE,CAAC;oBACvB,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;oBAC1B,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;gBACjD,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,MAAe,EAAE,EAAE;gBACnD,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACzB,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,eAAe,EAAE,CAAC;oBACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC,SAAS,CAAC,CAAC;oBACrC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,cAAe,EAAE,CAAC;YAC/C,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YAC9B,WAAW,CAAC,SAAS,GAAG,EAAE,CAAC;YAE3B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,eAAe,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,kBAAkB,EAAE,CAAC,cAAc,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC;gBACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,SAAiC;QAClE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;QAED,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC9C,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC;YAC9B,WAAW,CAAC,SAAS,GAAG,EAAE,CAAC;YAE3B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBAChC,IAAI,CAAC,SAAS,EAAE;oBAChB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,EAAE,MAAM,CAAC,CACjE;iBACF,CAAC,CAAC;gBACH,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBAC/D,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC;gBAC5D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAEO,iBAAiB,CAAC,aAAsB;QAC9C,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAExF,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,IAAI,oBAAoB,EAAE,CAAC;YAC5E,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,kBAAkB,EAAE,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB;YACrC,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC1C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAE5C,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;YACpE,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC;oBAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,UAAU;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,OAAwB;QACzC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,0BAA0B,CAAC,OAAgC;QACzD,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;IACpC,CAAC;IAED,wBAAwB,CAAC,OAAmB;QAC1C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,wBAAwB;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QACnD,MAAM,aAAa,GAAG,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CACpC,aAAa,EACb,CAAC,KAAa,EAAE,OAAmB,EAAE,EAAE;YACrC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAC9E,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAEzC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CACpC,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,aAAa,EACzC,CAAC,KAAa,EAAE,OAAmB,EAAE,UAAyB,EAAE,EAAE;YAChE,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACzD,CAAC,EACD,OAAO,CACR,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACjC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,gBAAiB,EAAE,CAAC;gBAC9C,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;gBACjB,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CACpC,QAAQ,CAAC,mBAAmB,EAC5B,CAAC,KAAa,EAAE,OAAmB,EAAE,UAAyB,EAAE,EAAE;oBAChE,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;gBAC9E,CAAC,EACD,QAAQ,CACT,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACjC,CAAC;IAEO,qBAAqB,CAC3B,KAAa,EACb,OAAmB,EACnB,UAAyB;QAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU;YAAE,OAAO;QACtE,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,OAAO;QAEtD,IAAI,KAAkB,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,aAAa,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7E,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,aAAa,CAAC;gBAAE,OAAO;YAC9D,KAAK,GAAG,aAAa,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO;QAEzD,MAAM,KAAK,GAA6C;YACtD,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,QAAQ;SAClB,CAAC;QACF,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC;QAE7D,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACpF,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAEO,yBAAyB,CAC/B,UAAkB,EAClB,KAAa,EACb,OAAmB,EACnB,UAAyB;QAEzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,UAAU,eAAe,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,KAAkB,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,aAAa,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7E,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,aAAa,CAAC;gBAAE,OAAO;YAC9D,KAAK,GAAG,aAAa,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO;QAEzD,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAEO,qBAAqB,CAAC,KAAa,EAAE,OAAmB;QAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,cAAc,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAe;QAC5C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QACnD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAEzC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CACpC,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,IAAI,OAAO,IAAI,EAC3C,CAAC,KAAa,EAAE,OAAmB,EAAE,UAAyB,EAAE,EAAE;YAChE,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACtD,CAAC,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,OAAe;QAChD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QACzC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,IAAI,OAAO,IAAI,CAAC,CAAC;IAC7E,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,KAAc;QAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,OAAO,CACL,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;YACxB,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC;YACf,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;YAC/B,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YACpD,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CACxE,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,MAAc,EAAE,KAAkB;QAC9D,MAAM,KAAK,GAAuC;YAChD,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;SACjB,CAAC;QACF,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,QAAQ;YACtC,MAAM;YACN,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;YACxB,WAAW,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;SACxC,CAAC;IACJ,CAAC;IAEO,gBAAgB,CACtB,KAAa;QAEb,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAEzC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CACzB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,UAAU,4CAA4C,CAAC,CACxF,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAC7B,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,UAAU,mDAAmD,CAAC,CAC/F,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,UAAyB;QAC5D,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAC7B,MAAM,SAAS,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAqB,CAAC;YACtD,IAAI,GAAG,KAAK,oBAAoB;gBAAE,OAAO,KAAK,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa,CAAC,UAAyB,EAAE,WAAoB;QACnE,IAAI,WAAW,KAAK,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAChE,OAAO,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC;IAClC,CAAC;IAEO,kBAAkB,CAAC,KAAa,EAAE,OAAmB,EAAE,UAAyB;QACtF,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;QAE9C,IAAI,KAAkB,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,aAAa,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7E,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,aAAa,CAAC;gBAAE,OAAO;YAC9D,KAAK,GAAG,aAAa,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAA6C;YACtD,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,QAAQ;SAClB,CAAC;QACF,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC;QAEtD,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO;QAEzD,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE9D,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAEO,aAAa,CAAC,OAAe,EAAE,QAAsB;QAC3D,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAEnD,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAEpE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAErC,MAAM,aAAa,GAAgD,aAAa,CAAC,GAAG,CAClF,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAC5C,CAAC;YAEF,MAAM,CAAC,UAAU,EAAE,GAAG,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACtD,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;gBAClC,GAAG,aAAa;aACjB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,UAAU,IAAI,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAA8C,EAAE,CAAC;YAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;YAC3D,MAAM,OAAO,GAAI,IAAI,CAAC,YAAY,CAAY,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,iBAAiB,GAAmB,EAAE,CAAC;YAC7C,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;gBAC9B,MAAM,cAAc,GAClB,QAAQ,CAAC,MAAM,KAAK,UAAU;oBAC5B,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,OAAO;oBACzB,CAAC,CAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU,CAAwB,KAAK,OAAO,CAAC;gBACtE,IAAI,cAAc,EAAE,CAAC;oBACnB,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe;QAC9B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAEO,oBAAoB,CAAC,QAAiC;QAC5D,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,GAAG,GAAI,QAAQ,CAAC,OAAkB,IAAI,kBAAkB,CAAC;YAC/D,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBAC1B,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAiC;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,EAAE,GAAI,IAAgC,CAAC,EAAE,CAAC;QAChD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,OAAsB,EACtB,IAA6B;QAE7B,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QACxD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,SAAS,EAAE,OAAO,CAAC,CAAC;QAChF,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,OAAsB,EACtB,EAAU,EACV,IAA6B;QAE7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACnF,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5C,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YAC9C,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,OAAsB,EAAE,EAAU;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5C,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YAC9C,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,WAAW,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,IAAI,OAAO,SAAS,EAAE;YACpF,CAAC,YAAY,CAAC,EAAE,GAAG;YACnB,CAAC,cAAc,CAAC,EAAE,GAAG;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,EAAU;QAC/C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACpC,OAAO,QAAQ,CAAC,IAA+B,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CACb,MAAc,EACd,OAAgB,EAChB,IAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAA4B,EAAE,CAAC;YAC5C,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBACzC,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACtB,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9E,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACpC,OAAQ,QAAQ,CAAC,IAAkC,IAAI,EAAE,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,OAAgB;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAE3E,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,aAAa,GAAG,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC;QAE7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvC,CAAC,EAAE,KAAK,CAAC,CAAC;YAEV,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE;gBAClC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,OAAO,CAAC,KAAgC,CAAC,CAAC;gBAC5C,CAAC;gBACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,cAAe,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;YACvB,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;YACtC,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAErC,IAAI,CAAC,MAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;gBACzF,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC;IAC3D,CAAC;IAED,cAAc,CAAC,OAAe;QAC5B,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,iBAAiB,CAAC,OAAe;QAC/B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,MAAmB;IACpE,OAAO,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC","sourcesContent":["import type {\n MqttClient,\n SubscribeOptions,\n PublishOptions,\n MessageProperties as WasmMsgProps,\n} from 'mqtt5-wasm';\nimport type {\n StoreConfig,\n SyncMutation,\n ScopeState,\n ConnectionStatus,\n SortField,\n SyncEngine,\n} from './types.ts';\nimport { OwnershipError } from './types.ts';\n\ninterface ChangeEvent {\n operation: 'Create' | 'Update' | 'Delete';\n entity: string;\n id: string;\n data: Record<string, unknown> | null;\n operation_id?: string;\n sequence?: number;\n sender?: string;\n}\n\ntype MutationHandler = (scopeId: string, mutation: SyncMutation) => void;\ntype ConnectionStatusHandler = (status: ConnectionStatus) => void;\n\nconst FAST_RECONNECT_LIMIT = 5;\nconst SLOW_RECONNECT_INTERVAL = 15_000;\n\nfunction applyTicketAuth(\n connectOpts: import('mqtt5-wasm').ConnectOptions,\n ticket: string | undefined\n): void {\n if (!ticket) return;\n connectOpts.authenticationMethod = 'JWT';\n connectOpts.authenticationData = new TextEncoder().encode(ticket);\n}\n\nclass SyncEngineImpl implements SyncEngine {\n private client: MqttClient | null = null;\n private readonly clientId: string;\n private readonly config: StoreConfig;\n private readonly prefix: string;\n private readonly responsePrefix: string;\n private SubscribeOptions: (new () => SubscribeOptions) | null = null;\n private PublishOptions: (new () => PublishOptions) | null = null;\n private ConnectOptions: (new () => import('mqtt5-wasm').ConnectOptions) | null = null;\n\n private desiredScopes = new Set<string>();\n private subscribedScopes = new Set<string>();\n private appliedVersion = new Map<string, number>();\n private buffered = new Map<string, SyncMutation[]>();\n private awaitingState = new Set<string>();\n private pendingRequests = new Map<\n string,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n\n private topLevelSubscribed = false;\n\n private onMutation: MutationHandler | null = null;\n private onConnectionStatus: ConnectionStatusHandler | null = null;\n private onSessionInvalid: (() => void) | null = null;\n private getTicket: (() => Promise<string>) | null = null;\n private active = false;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectAttempt = 0;\n private reconnecting = false;\n private slowReconnecting = false;\n private serverUrl: string | null = null;\n\n constructor(clientId: string, config: StoreConfig) {\n if (/[+#/]/.test(clientId)) {\n throw new Error('clientId must not contain MQTT special characters (+, #, /)');\n }\n this.clientId = clientId;\n this.config = config;\n this.prefix = config.syncTopicPrefix ?? '$DB';\n this.responsePrefix = config.responseTopicPrefix ?? '$SYS/responses';\n }\n\n async connect(\n serverUrl: string,\n wasmModule: unknown,\n getTicket?: () => Promise<string>\n ): Promise<void> {\n this.onConnectionStatus?.('connecting');\n this.active = true;\n this.serverUrl = serverUrl;\n\n if (getTicket) {\n this.getTicket = getTicket;\n }\n\n if (!this.client) {\n const mod = wasmModule as typeof import('mqtt5-wasm');\n const {\n default: initMqttWasm,\n MqttClient,\n ConnectOptions,\n SubscribeOptions,\n PublishOptions,\n } = mod;\n await initMqttWasm();\n this.client = new MqttClient(this.clientId);\n this.SubscribeOptions = SubscribeOptions;\n this.PublishOptions = PublishOptions;\n this.ConnectOptions = ConnectOptions;\n\n this.client.onConnect(() => {\n if (!this.active) return;\n this.clearReconnectTimer();\n this.reconnectAttempt = 0;\n this.slowReconnecting = false;\n this.topLevelSubscribed = false;\n Promise.all([this.subscribeToResponseTopic(), this.subscribeToTopLevel()])\n .then(() => {\n if (this.active) this.onConnectionStatus?.('connected');\n for (const scopeId of this.desiredScopes) {\n this.subscribeToScope(scopeId)\n .then(() => this.subscribedScopes.add(scopeId))\n .catch((err) => console.error(`[SyncEngine] Re-subscribe ${scopeId} failed:`, err));\n }\n })\n .catch((err) => {\n console.error('[SyncEngine] Post-connect subscribe failed:', err);\n this.onConnectionStatus?.('error');\n this.scheduleReconnect();\n });\n });\n\n this.client.onDisconnect(() => {\n if (!this.active) return;\n if (this.reconnecting) return;\n this.onConnectionStatus?.('disconnected');\n this.cleanupOnDisconnect();\n if (this.client?.isBrowserOnline()) {\n this.scheduleReconnect();\n }\n });\n\n this.client.onError((error: string) => {\n if (!this.active) return;\n if (/closed by peer|connection reset/i.test(error)) return;\n if (/not.?authorized|bad.?user|bad.?password|authentication|0x8[567]/i.test(error)) {\n this.cancelReconnect();\n this.onSessionInvalid?.();\n return;\n }\n console.error('[SyncEngine] MQTT error:', error);\n this.onConnectionStatus?.('error');\n });\n\n this.client.onConnectivityChange((online: boolean) => {\n if (!this.active) return;\n if (!online) {\n this.cancelReconnect();\n this.onConnectionStatus?.('offline');\n this.cleanupOnDisconnect();\n } else {\n this.scheduleReconnect(0);\n }\n });\n }\n\n try {\n const connectOpts = new this.ConnectOptions!();\n connectOpts.cleanStart = true;\n connectOpts.keepAlive = 60;\n\n if (this.getTicket) {\n applyTicketAuth(connectOpts, await this.getTicket());\n }\n\n await this.client.connectWithOptions(serverUrl, connectOpts);\n } catch (err) {\n this.onConnectionStatus?.('disconnected');\n if (this.client?.isBrowserOnline()) {\n this.scheduleReconnect();\n }\n throw err;\n }\n }\n\n async reconnect(serverUrl: string, getTicket?: () => Promise<string>): Promise<void> {\n if (!this.client || !this.ConnectOptions) {\n throw new Error('Cannot reconnect before initial connect');\n }\n\n this.clearReconnectTimer();\n this.reconnecting = true;\n this.active = true;\n this.serverUrl = serverUrl;\n if (!this.slowReconnecting) {\n this.onConnectionStatus?.('connecting');\n }\n\n if (getTicket) {\n this.getTicket = getTicket;\n }\n\n try {\n this.client.disconnect();\n } catch {\n // WASM client may throw if already disconnected\n }\n\n let failed = false;\n try {\n const connectOpts = new this.ConnectOptions();\n connectOpts.cleanStart = true;\n connectOpts.keepAlive = 60;\n\n if (this.getTicket) {\n const ticket = await Promise.race([\n this.getTicket(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('getTicket timeout')), 10_000)\n ),\n ]);\n applyTicketAuth(connectOpts, ticket);\n }\n\n await this.client.connectWithOptions(serverUrl, connectOpts);\n } catch (err) {\n if (err instanceof Error && err.name === 'SessionExpiredError') {\n this.cancelReconnect();\n this.onSessionInvalid?.();\n return;\n }\n failed = true;\n throw err;\n } finally {\n this.reconnecting = false;\n if (failed && this.active && this.client?.isBrowserOnline()) {\n this.scheduleReconnect();\n }\n }\n }\n\n private cleanupOnDisconnect(): void {\n this.subscribedScopes.clear();\n this.appliedVersion.clear();\n this.buffered.clear();\n this.awaitingState.clear();\n this.topLevelSubscribed = false;\n for (const [, { reject }] of this.pendingRequests) {\n reject(new Error('Disconnected'));\n }\n this.pendingRequests.clear();\n }\n\n private scheduleReconnect(delayOverride?: number): void {\n if (this.reconnectTimer || this.reconnecting || !this.active || !this.serverUrl) return;\n\n if (!this.slowReconnecting && this.reconnectAttempt >= FAST_RECONNECT_LIMIT) {\n this.slowReconnecting = true;\n this.onConnectionStatus?.('disconnected');\n }\n\n const baseDelay = this.slowReconnecting\n ? SLOW_RECONNECT_INTERVAL\n : (delayOverride ?? Math.min(1000 * 2 ** this.reconnectAttempt, 30000));\n const jitter = Math.random() * (baseDelay / 4);\n const delay = Math.round(baseDelay + jitter);\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = null;\n if (!this.active || !this.serverUrl) return;\n\n this.reconnectAttempt++;\n try {\n await this.reconnect(this.serverUrl, this.getTicket ?? undefined);\n } catch {\n if (this.active && this.client?.isBrowserOnline()) {\n this.scheduleReconnect();\n }\n }\n }, delay);\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private cancelReconnect(): void {\n this.clearReconnectTimer();\n this.reconnectAttempt = 0;\n this.slowReconnecting = false;\n }\n\n disconnect(): void {\n this.active = false;\n this.reconnecting = false;\n this.cancelReconnect();\n this.cleanupOnDisconnect();\n try {\n this.client?.disconnect();\n } catch {\n // mqtt5-wasm may throw on disconnect\n }\n }\n\n setMutationHandler(handler: MutationHandler): void {\n this.onMutation = handler;\n }\n\n setConnectionStatusHandler(handler: ConnectionStatusHandler): void {\n this.onConnectionStatus = handler;\n }\n\n setSessionInvalidHandler(handler: () => void): void {\n this.onSessionInvalid = handler;\n }\n\n private async subscribeToResponseTopic(): Promise<void> {\n if (!this.client || !this.SubscribeOptions) return;\n const responseTopic = `${this.responsePrefix}/${this.clientId}/#`;\n const subOpts = new this.SubscribeOptions();\n subOpts.qos = 1;\n await this.client.subscribeWithOptions(\n responseTopic,\n (topic: string, payload: Uint8Array) => {\n this.handleResponseMessage(topic, payload);\n },\n subOpts\n );\n }\n\n private async subscribeToTopLevel(): Promise<void> {\n if (!this.client || !this.SubscribeOptions || this.topLevelSubscribed) return;\n const { rootEntity } = this.config.scope;\n\n const subOpts = new this.SubscribeOptions();\n subOpts.qos = 1;\n await this.client.subscribeWithOptions(\n `${this.prefix}/${rootEntity}/+/events/#`,\n (topic: string, payload: Uint8Array, properties?: WasmMsgProps) => {\n this.handleRootEntityEvent(topic, payload, properties);\n },\n subOpts\n );\n\n if (this.config.topLevelEntities) {\n for (const topLevel of this.config.topLevelEntities) {\n const tSubOpts = new this.SubscribeOptions!();\n tSubOpts.qos = 1;\n await this.client.subscribeWithOptions(\n topLevel.subscriptionPattern,\n (topic: string, payload: Uint8Array, properties?: WasmMsgProps) => {\n this.handleTopLevelEntityEvent(topLevel.entity, topic, payload, properties);\n },\n tSubOpts\n );\n }\n }\n\n this.topLevelSubscribed = true;\n }\n\n private handleRootEntityEvent(\n topic: string,\n payload: Uint8Array,\n properties?: WasmMsgProps\n ): void {\n const parsed = this.parseScopedTopic(topic);\n if (!parsed || parsed.entity !== this.config.scope.rootEntity) return;\n if (this.subscribedScopes.has(parsed.scopeId)) return;\n\n let event: ChangeEvent;\n try {\n const parsedPayload: unknown = JSON.parse(new TextDecoder().decode(payload));\n if (!SyncEngineImpl.isValidChangeEvent(parsedPayload)) return;\n event = parsedPayload;\n } catch {\n return;\n }\n\n if (this.isOwnMutation(properties, event.sender)) return;\n\n const opMap: Record<string, ChangeEvent['operation']> = {\n created: 'Create',\n updated: 'Update',\n deleted: 'Delete',\n };\n event.operation = opMap[parsed.eventType] ?? event.operation;\n\n const mutation = SyncEngineImpl.mapChangeEvent(this.config.scope.rootEntity, event);\n this.applyMutation('__global__', mutation);\n }\n\n private handleTopLevelEntityEvent(\n entityName: string,\n topic: string,\n payload: Uint8Array,\n properties?: WasmMsgProps\n ): void {\n const match = topic.match(new RegExp(`^\\\\${this.prefix}/${entityName}/events/(.+)$`));\n if (!match) return;\n\n let event: ChangeEvent;\n try {\n const parsedPayload: unknown = JSON.parse(new TextDecoder().decode(payload));\n if (!SyncEngineImpl.isValidChangeEvent(parsedPayload)) return;\n event = parsedPayload;\n } catch {\n return;\n }\n\n if (this.isOwnMutation(properties, event.sender)) return;\n\n const mutation = SyncEngineImpl.mapChangeEvent(entityName, event);\n this.applyMutation('__global__', mutation);\n }\n\n private handleResponseMessage(topic: string, payload: Uint8Array): void {\n const match = topic.match(new RegExp(`^\\\\${this.responsePrefix}/[^/]+/(.+)$`));\n if (!match) return;\n\n const requestId = match[1];\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n this.pendingRequests.delete(requestId);\n try {\n const response = JSON.parse(new TextDecoder().decode(payload));\n pending.resolve(response);\n } catch {\n pending.reject(new Error('Invalid response format'));\n }\n }\n }\n\n private async subscribeToScope(scopeId: string): Promise<void> {\n if (!this.client || !this.SubscribeOptions) return;\n const { rootEntity } = this.config.scope;\n\n const subOpts = new this.SubscribeOptions();\n subOpts.qos = 1;\n await this.client.subscribeWithOptions(\n `${this.prefix}/${rootEntity}/${scopeId}/#`,\n (topic: string, payload: Uint8Array, properties?: WasmMsgProps) => {\n this.handleWatchMessage(topic, payload, properties);\n },\n subOpts\n );\n }\n\n private async unsubscribeFromScope(scopeId: string): Promise<void> {\n if (!this.client) return;\n const { rootEntity } = this.config.scope;\n await this.client.unsubscribe(`${this.prefix}/${rootEntity}/${scopeId}/#`);\n }\n\n private static isValidChangeEvent(value: unknown): value is ChangeEvent {\n if (typeof value !== 'object' || value === null) return false;\n const e = value as Record<string, unknown>;\n return (\n typeof e.id === 'string' &&\n e.id.length > 0 &&\n typeof e.operation === 'string' &&\n ['Create', 'Update', 'Delete'].includes(e.operation) &&\n (e.data === undefined || e.data === null || typeof e.data === 'object')\n );\n }\n\n private static mapChangeEvent(entity: string, event: ChangeEvent): SyncMutation {\n const opMap: Record<string, SyncMutation['op']> = {\n Create: 'insert',\n Update: 'update',\n Delete: 'delete',\n };\n return {\n op: opMap[event.operation] ?? 'update',\n entity,\n id: event.id,\n data: event.data ?? null,\n operationId: event.operation_id ?? null,\n };\n }\n\n private parseScopedTopic(\n topic: string\n ): { scopeId: string; entity: string; eventType: string } | null {\n const { rootEntity } = this.config.scope;\n\n const rootOwn = topic.match(\n new RegExp(`^\\\\${this.prefix}/${rootEntity}/([^/]+)/events/(created|updated|deleted)$`)\n );\n if (rootOwn) {\n return { scopeId: rootOwn[1], entity: rootEntity, eventType: rootOwn[2] };\n }\n\n const childEntity = topic.match(\n new RegExp(`^\\\\${this.prefix}/${rootEntity}/([^/]+)/(\\\\w+)/events/(created|updated|deleted)$`)\n );\n if (childEntity) {\n return { scopeId: childEntity[1], entity: childEntity[2], eventType: childEntity[3] };\n }\n\n return null;\n }\n\n private static extractOriginClientId(properties?: WasmMsgProps): string | null {\n if (!properties) return null;\n const userProps = properties.getUserProperties();\n for (let i = 0; i < userProps.length; i++) {\n const [key, value] = userProps[i] as [string, string];\n if (key === 'x-origin-client-id') return value;\n }\n return null;\n }\n\n private isOwnMutation(properties?: WasmMsgProps, eventSender?: string): boolean {\n if (eventSender === this.clientId) return true;\n const origin = SyncEngineImpl.extractOriginClientId(properties);\n return origin === this.clientId;\n }\n\n private handleWatchMessage(topic: string, payload: Uint8Array, properties?: WasmMsgProps): void {\n const parsed = this.parseScopedTopic(topic);\n if (!parsed) return;\n\n const { scopeId, entity, eventType } = parsed;\n\n let event: ChangeEvent;\n try {\n const parsedPayload: unknown = JSON.parse(new TextDecoder().decode(payload));\n if (!SyncEngineImpl.isValidChangeEvent(parsedPayload)) return;\n event = parsedPayload;\n } catch {\n return;\n }\n\n const opMap: Record<string, ChangeEvent['operation']> = {\n created: 'Create',\n updated: 'Update',\n deleted: 'Delete',\n };\n event.operation = opMap[eventType] ?? event.operation;\n\n if (this.isOwnMutation(properties, event.sender)) return;\n\n const mutation = SyncEngineImpl.mapChangeEvent(entity, event);\n\n if (this.awaitingState.has(scopeId)) {\n this.buffered.get(scopeId)?.push(mutation);\n return;\n }\n\n this.applyMutation(scopeId, mutation);\n }\n\n private applyMutation(scopeId: string, mutation: SyncMutation): void {\n this.onMutation?.(scopeId, mutation);\n }\n\n async openScope(scopeId: string): Promise<ScopeState> {\n if (!this.client) throw new Error('Not connected');\n\n const { rootEntity, childEntities, scopeField } = this.config.scope;\n\n this.desiredScopes.add(scopeId);\n this.awaitingState.add(scopeId);\n this.buffered.set(scopeId, []);\n this.subscribedScopes.add(scopeId);\n\n try {\n await this.subscribeToScope(scopeId);\n\n const fetchPromises: Promise<Record<string, unknown>[] | null>[] = childEntities.map(\n (entity) => this.fetchList(entity, scopeId)\n );\n\n const [rootRecord, ...childResults] = await Promise.all([\n this.fetchOne(rootEntity, scopeId),\n ...fetchPromises,\n ]);\n\n const root = rootRecord ?? {};\n const children: Record<string, Record<string, unknown>[]> = {};\n for (let i = 0; i < childEntities.length; i++) {\n children[childEntities[i]] = childResults[i] ?? [];\n }\n\n const versionField = this.config.versionField ?? 'version';\n const version = (root[versionField] as number) || 0;\n this.appliedVersion.set(scopeId, version);\n\n const buffer = this.buffered.get(scopeId) || [];\n const bufferedMutations: SyncMutation[] = [];\n for (const mutation of buffer) {\n const belongsToScope =\n mutation.entity === rootEntity\n ? mutation.id === scopeId\n : (mutation.data?.[scopeField] as string | undefined) === scopeId;\n if (belongsToScope) {\n bufferedMutations.push(mutation);\n }\n }\n\n this.buffered.delete(scopeId);\n this.awaitingState.delete(scopeId);\n\n return { root, children, version, bufferedMutations };\n } catch (err) {\n this.buffered.delete(scopeId);\n this.awaitingState.delete(scopeId);\n this.subscribedScopes.delete(scopeId);\n throw err;\n }\n }\n\n async closeScope(scopeId: string): Promise<void> {\n this.desiredScopes.delete(scopeId);\n this.subscribedScopes.delete(scopeId);\n this.buffered.delete(scopeId);\n this.awaitingState.delete(scopeId);\n this.appliedVersion.delete(scopeId);\n await this.unsubscribeFromScope(scopeId);\n }\n\n private checkResponseAndAuth(response: Record<string, unknown>): void {\n if (response.status === 'error') {\n const msg = (response.message as string) || 'Operation failed';\n if (response.code === 401) {\n this.onSessionInvalid?.();\n throw new Error(msg);\n }\n if (response.code === 403) {\n throw new OwnershipError(msg);\n }\n throw new Error(msg);\n }\n }\n\n private extractResponseId(response: Record<string, unknown>): string {\n const data = response.data;\n if (typeof data !== 'object' || data === null) {\n throw new Error('Response missing data payload');\n }\n const id = (data as Record<string, unknown>).id;\n if (typeof id !== 'string' || id.length === 0) {\n throw new Error('Response missing valid id');\n }\n return id;\n }\n\n async createEntity(\n entity: string,\n scopeId: string | null,\n data: Record<string, unknown>\n ): Promise<string> {\n const { scopeField, childEntities } = this.config.scope;\n const isChild = childEntities.includes(entity);\n const payload = isChild && scopeId ? { ...data, [scopeField]: scopeId } : data;\n\n const response = await this.request(`${this.prefix}/${entity}/create`, payload);\n this.checkResponseAndAuth(response);\n const id = this.extractResponseId(response);\n\n if (isChild && scopeId) {\n await this.bumpScopeVersion(scopeId);\n }\n\n return id;\n }\n\n async updateEntity(\n entity: string,\n scopeId: string | null,\n id: string,\n data: Record<string, unknown>\n ): Promise<void> {\n const response = await this.request(`${this.prefix}/${entity}/${id}/update`, data);\n this.checkResponseAndAuth(response);\n\n const { childEntities } = this.config.scope;\n if (childEntities.includes(entity) && scopeId) {\n await this.bumpScopeVersion(scopeId);\n }\n }\n\n async deleteEntity(entity: string, scopeId: string | null, id: string): Promise<void> {\n const response = await this.request(`${this.prefix}/${entity}/${id}/delete`, {});\n this.checkResponseAndAuth(response);\n\n const { childEntities } = this.config.scope;\n if (childEntities.includes(entity) && scopeId) {\n await this.bumpScopeVersion(scopeId);\n }\n }\n\n async bumpScopeVersion(scopeId: string): Promise<void> {\n const { rootEntity } = this.config.scope;\n const versionField = this.config.versionField ?? 'version';\n const updatedAtField = this.config.updatedAtField ?? 'updatedAt';\n const now = Date.now();\n\n const response = await this.request(`${this.prefix}/${rootEntity}/${scopeId}/update`, {\n [versionField]: now,\n [updatedAtField]: now,\n });\n this.checkResponseAndAuth(response);\n this.appliedVersion.set(scopeId, now);\n }\n\n private async fetchOne(entity: string, id: string): Promise<Record<string, unknown> | null> {\n try {\n const response = await this.request(`${this.prefix}/${entity}/${id}`, {});\n this.checkResponseAndAuth(response);\n return response.data as Record<string, unknown>;\n } catch {\n return null;\n }\n }\n\n async fetchList(\n entity: string,\n scopeId?: string,\n sort?: SortField[]\n ): Promise<Record<string, unknown>[] | null> {\n try {\n const payload: Record<string, unknown> = {};\n if (scopeId) {\n const { scopeField } = this.config.scope;\n payload.filters = [{ field: scopeField, op: 'eq', value: scopeId }];\n }\n if (sort && sort.length > 0) {\n payload.sort = sort;\n }\n const response = await this.request(`${this.prefix}/${entity}/list`, payload);\n this.checkResponseAndAuth(response);\n return (response.data as Record<string, unknown>[]) || [];\n } catch {\n return null;\n }\n }\n\n async request(topic: string, payload: unknown): Promise<Record<string, unknown>> {\n if (!this.client || !this.PublishOptions) throw new Error('Not connected');\n\n const requestId = crypto.randomUUID();\n const responseTopic = `${this.responsePrefix}/${this.clientId}/${requestId}`;\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error('Request timeout'));\n }, 10000);\n\n this.pendingRequests.set(requestId, {\n resolve: (value) => {\n clearTimeout(timeout);\n resolve(value as Record<string, unknown>);\n },\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n\n const encoder = new TextEncoder();\n const pubOpts = new this.PublishOptions!();\n pubOpts.qos = 1;\n pubOpts.retain = false;\n pubOpts.responseTopic = responseTopic;\n pubOpts.correlationData = encoder.encode(requestId);\n\n const body = JSON.stringify(payload);\n\n this.client!.publishWithOptions(topic, encoder.encode(body), pubOpts).catch((err: Error) => {\n this.pendingRequests.delete(requestId);\n clearTimeout(timeout);\n reject(err);\n });\n });\n }\n\n get isReconnecting(): boolean {\n return this.reconnecting || this.reconnectTimer !== null;\n }\n\n isSubscribedTo(scopeId: string): boolean {\n return this.subscribedScopes.has(scopeId);\n }\n\n getAppliedVersion(scopeId: string): number {\n return this.appliedVersion.get(scopeId) || 0;\n }\n}\n\nexport function createSyncEngine(clientId: string, config: StoreConfig): SyncEngine {\n return new SyncEngineImpl(clientId, config);\n}\n"]}
|