🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@nxtedition/couch

Package Overview
Dependencies
Maintainers
12
Versions
63
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@nxtedition/couch - npm Package Compare versions

Comparing version
1.1.51
to
2.0.0
+1
lib/index.d.ts.map
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAIV,UAAU,EACV,UAAU,EAEX,MAAM,wBAAwB,CAAA;AAK/B,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,QAAQ,EACd,MAAM,YAAY,CAAA;AAEnB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAEtE,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,CAAA;IAC5C,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,WAAW,CAAA;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,UAAU,CAAA;IAGnB,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAA;CACnD;AAED,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACvC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO;IAC7C,IAAI,EAAE,CAAC,CAAA;IACP,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACpC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChC;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,EAAE,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAA;CAAE,CAAA;AAExE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAA;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,EACxD,IAAI,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KACnC,OAAO,CAAA;AAEZ,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IAC/B,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;CAC3B;AAID,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC;IACvE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAKD,MAAM,WAAW,UAAU,CACzB,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;IAE1C,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,OAAO,CAAA;IACZ,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe,CAC9B,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;IAE1C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzD,OAAO,EAAE,OAAO,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;CACT;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,GAAG,CAAA;IACR,OAAO,CAAC,CAAC,GAAG,OAAO,EACjB,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,QAAQ,CAAC,CAAC,GAAG,OAAO,EAClB,IAAI,EAAE;QAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACxC,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAA;IAChC,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/F,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;IAChC,GAAG,CAAC,CAAC,GAAG,OAAO,EACb,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,CAAC,CAAC,CAAA;IACb,IAAI,CAAC,CAAC,GAAG,OAAO,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,CAAC,CAAC,CAAA;IACb,GAAG,CAAC,CAAC,GAAG,OAAO,EACb,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,CAAC,CAAC,CAAA;IACb,MAAM,CAAC,CAAC,GAAG,OAAO,EAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,CAAC,CAAC,CAAA;IACb,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,CAAC,CAAC,CAAA;IACb,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,EACrD,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,UAAU,CAAC;QAAC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE,GAC9D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7B,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7E,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,UAAU,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAID,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAmBzD,CAAA;AAgCF,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAu8BzD"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,WAAW,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAErC,OAAO,WAAW,MAAM,aAAa,CAAA;AACrC,OAAO,OAAO,MAAM,UAAU,CAAA;AAE9B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AASjF,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAG9C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GAGpB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAgNtC,oEAAoE;AACpE,wEAAwE;AACxE,MAAM,CAAC,MAAM,6BAA6B,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC5E,YAAY;IACZ,cAAc;IACd,WAAW;IACX,UAAU;IACV,aAAa;IACb,WAAW;IACX,cAAc;IACd,OAAO;IACP,WAAW;IACX,SAAS;IACT,yBAAyB;IACzB,gBAAgB;IAChB,yEAAyE;IACzE,wEAAwE;IACxE,6EAA6E;IAC7E,oDAAoD;IACpD,sBAAsB;IACtB,yBAAyB;CAC1B,CAAC,CAAA;AAgCF,MAAM,UAAU,SAAS,CAAC,IAAkB;IAC1C,IAAI,MAAoB,CAAA;IACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,IAAI,CAAA;IACf,CAAC;SAAM,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;QACrB,MAAM,GAAG,IAAI,CAAA;IACf,CAAC;SAAM,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;QACxC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAE,CAAA;IACxC,CAAC;SAAM,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACxB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAA;IAClE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACpC,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;IAC1B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;IAC1C,CAAC;IAED,2EAA2E;IAC3E,6DAA6D;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAA;IACpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACpC,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IAEjE,MAAM,iBAAiB,GAAG;QACxB,cAAc,EAAE,GAAG;KACpB,CAAA;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAK,UAAqC,CAAC,SAAS,CAAA;IACtF,MAAM,aAAa,GAAe,IAAI,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;IAEvE,MAAM,SAAS,GACb,MAAM,CAAC,SAAS;QAChB,aAAa,CACX,CAAC,SAAiB,EAAc,EAAE,CAChC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,GAAG,iBAAiB;YACpB,WAAW,EAAE,CAAC,EAAE,4BAA4B;YAC5C,UAAU,EAAE,CAAC;SACd,CAAC,CACL,CAAA;IAEH,SAAS,SAAS,CAChB,GAAoB,EACpB,GAA0D;QAE1D,IAAI,IAAI,CAAA;QAER,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,UAAU,CAAA;YACjB,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjB,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;YACpC,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,IAAI,IAAI,IAAI,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,MAA6B,CAAC,EAAE,CAAA;YACxE,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAA;QACV,IAAI,KAAK,CAAA;QACT,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAG3E,CAAA;YACD,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACpB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;QAED,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE;YAC7B,MAAM;YACN,KAAK;YACL,IAAI,EAAE;gBACJ,GAAG,EAAE;oBACH,MAAM,EAAE,QAAQ;oBAChB,IAAI;oBACJ,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,qEAAqE;oBACrE,oEAAoE;oBACpE,IAAI,EACF,GAAG,CAAC,IAAI,IAAI,IAAI;wBACd,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;wBACrF,CAAC,CAAC,IAAI;iBACX;gBACD,GAAG,EAAE;oBACH,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;iBACf;aACF;SACF,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,EACtB,MAAM,GAAG,aAAa,EACtB,MAAM,EACN,MAAM,EACN,GAAG,OAAO,KACQ,EAAE;QACpB,MAAM,MAAM,GAAkB,EAAE,CAAA;QAEhC,IAAI,IAAiB,CAAA;QACrB,IAAI,MAAM,GAAG,KAAK,CAAA;QAElB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAA;QACzB,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,CAAC,UAAU,GAAG,IAAI,CAAA;QAC1B,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,CAAC,YAAY,GAAG,IAAI,CAAA;QAC5B,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;YACjC,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;QAC5C,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC9B,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC9B,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC9B,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QAC5B,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAChC,CAAC;QAED,0EAA0E;QAC1E,sCAAsC;QACtC,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,KAAK,OAAO,CAAA;QAC3B,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;YAC9B,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,SAAS,GAAG,IAAI,CAAA;QACzB,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;QAClC,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC9B,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAC5B,MAAM,GAAG,MAAM,CAAA;YACf,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAA;YAC5C,MAAM,CAAC,MAAM,GAAG,UAAU,CAAA;QAC5B,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC7B,MAAM,GAAG,MAAM,CAAA;YACf,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAA;YAC9C,MAAM,CAAC,MAAM,GAAG,WAAW,CAAA;QAC7B,CAAC;QAED,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACrC,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAA;QAChC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,sEAAsE;YACtE,oDAAoD;YACpD,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC1B,CAAC,CAAA;QAED,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAO,MAAM,CAAC,MAA4B,IAAI,IAAI,UAAU,EAAE,CAAA;YAChE,CAAC;YAED,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACnC,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,GAAG,GAAG,IAAI,CAAA;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAA;QACnD,MAAM,KAAK,GACT,OAAO,CAAC,KAAK;YACb,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE;gBACnD,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,CAAA;gBAC3D,OAAO,IAAI,EAAE,CAAA;YACf,CAAC,CAAC,CAAA;QACJ,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAA;QAEzC,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,QAAQ,CAAC;gBACd,MAAM;gBACN,IAAI;gBACJ,KAAK;gBACL,aAAa;gBACb,MAAM;gBACN,IAAI;gBACJ,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,MAAM;gBACN,MAAM;gBACN,QAAQ;aACT,CAAC,CAAA;QACJ,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,IAAI,MAAM,EAAE,CAAC;gBACX,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,SAAS,CAAC,CAAC,QAAQ,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,MAAM,EACN,MAAM,EACN,IAAI,EACJ,MAAM,EACN,MAAM,EACN,MAAM,EACN,aAAa,GAAG,GAAG,GAAG,IAAI,EAC1B,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,EACtD,QAAQ,GAaT;QACC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAA;QAErC,qEAAqE;QACrE,mEAAmE;QACnE,kEAAkE;QAClE,IAAI,SAAoC,CAAA;QAExC,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,GAA6B,CAAA;YACjC,IAAI,CAAC;gBACH,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5B,qEAAqE;oBACrE,oEAAoE;oBACpE,iEAAiE;oBACjE,oEAAoE;oBACpE,qEAAqE;oBACrE,MAAM,IAAI,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;wBAC/D,MAAM;wBACN,UAAU,EAAE,MAAM;wBAClB,KAAK,EAAE,KAAK;qBACb,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAA4B,CAAA;oBAC7D,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAA;gBACrC,CAAC;gBAED,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;gBAEjE,kEAAkE;gBAClE,sEAAsE;gBACtE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,EAAE;oBACpF,KAAK;oBACL,OAAO,EAAE,IAAI;wBACX,CAAC,CAAC;4BACE,cAAc,EAAE,kBAAkB;yBACnC;wBACH,CAAC,CAAC,IAAI;oBACR,QAAQ;oBACR,MAAM;oBACN,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,KAAK;oBACZ,UAAU,EAAE,KAAK;oBACjB,MAAM;oBACN,cAAc,EAAE,CAAC,GAAG,IAAI;oBACxB,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;oBAC3C,aAAa;oBACb,UAAU,EAAE,MAAM;oBAClB,MAAM;oBACN,QAAQ;iBACS,CAAC,CAAA;gBAEpB,UAAU,GAAG,CAAC,CAAA;gBACd,SAAS,GAAG,CAAC,CAAA;gBAEb,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA;gBAEf,MAAM,OAAO,GAAiB,EAAE,CAAA;gBAEhC,IAAI,MAAM,GAAwB,IAAI,CAAA;gBACtC,IAAI,KAAK,GAAiB,IAAI,CAAA;gBAC9B,IAAI,KAAK,GAAG,KAAK,CAAA;gBACjB,IAAI,KAAK,GAAG,CAAC,CAAA;gBACb,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAA;gBAEhC,SAAS,WAAW;oBAClB,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,EAAE,CAAA;wBACR,MAAM,GAAG,IAAI,CAAA;oBACf,CAAC;gBACH,CAAC;gBAED,GAAG;qBACA,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;qBAC3B,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACnB,KAAK,GAAG,GAAG,CAAA;oBACX,WAAW,EAAE,CAAA;gBACf,CAAC,CAAC;qBACD,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACd,KAAK,GAAG,IAAI,CAAA;oBACZ,WAAW,EAAE,CAAA;gBACf,CAAC,CAAC;qBACD,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;gBAE3B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAA;gBACxC,IAAI,GAAG,GAAG,EAAE,CAAA;gBACZ,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAmB,CAAA;oBAEzC,IAAI,IAAI,GAAG,IAAI,CAAA;oBACf,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;wBAClB,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;oBAChD,CAAC;yBAAM,IAAI,KAAK,EAAE,CAAC;wBACjB,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,CAAA;oBACjC,CAAC;oBAED,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;wBACjB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;wBAEzC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;wBAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;4BACzB,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gCAChB,iDAAiD;4BACnD,CAAC;iCAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gCACxB,2EAA2E;4BAC7E,CAAC;iCAAM,IAAI,IAAI,EAAE,CAAC;gCAChB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuC,CAAA;gCACnE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oCAClB,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAA;gCACvB,CAAC;qCAAM,CAAC;oCACN,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAA;oCACzB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gCACpB,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,kEAAkE;gCAClE,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oCAChB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wCACvB,KAAK,GAAG,CAAC,CAAA;oCACX,CAAC;yCAAM,CAAC;wCACN,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAAA;oCACxC,CAAC;gCACH,CAAC;qCAAM,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oCACvB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wCACzB,KAAK,GAAG,CAAC,CAAA;oCACX,CAAC;yCAAM,CAAC;wCACN,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;wCACrC,IAAI,CAAC;4CACH,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,eAAe,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAA;4CACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAe,CAAA;4CAC3D,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,KAAK,CAAA;4CAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;wCACtB,CAAC;wCAAC,OAAO,GAAG,EAAE,CAAC;4CACb,MAAM,MAAM,CAAC,MAAM,CAAC,GAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;wCACnD,CAAC;oCACH,CAAC;gCACH,CAAC;qCAAM,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oCACvB,KAAK,GAAG,CAAC,CAAA;oCACT,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAA;oCACvC,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC,CAAA;gCAC3C,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wBAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAgB,CAAA;wBAC5C,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;wBAClC,MAAM,GAAG,CAAA;wBACT,iEAAiE;wBACjE,mEAAmE;wBACnE,qDAAqD;wBACrD,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;4BACzB,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAA;4BAC1B,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gCACtB,OAAM;4BACR,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,EAAE,CAAC;wBACjB,kEAAkE;wBAClE,iEAAiE;wBACjE,MAAM,KAAc,CAAA;oBACtB,CAAC;yBAAM,IAAI,CAAC,KAAK,EAAE,CAAC;wBAClB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;4BAClC,MAAM,GAAG,OAAO,CAAA;wBAClB,CAAC,CAAC,CAAA;oBACJ,CAAC;yBAAM,CAAC;wBACN,IAAI,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;4BAC/C,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS,IAAI,IAAI,CAAA;wBAC3C,CAAC;wBAED,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAgB,CAAA;wBAC5C,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;wBAClC,MAAM,GAAG,CAAA;wBACT,OAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,oEAAoE;gBACpE,qEAAqE;gBACrE,IAAI,MAAM,CAAC,OAAO,IAAK,GAAa,EAAE,IAAI,KAAK,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;oBACtE,MAAM,GAAG,CAAA;gBACX,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,eAAe,CAAC,CAAA;oBAEvC,SAAS,KAAK,IAAI,CAAC,GAAG,EAAE,CAAA;oBACxB,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;oBAC9E,IAAI,CAAC;wBACH,MAAM,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE;4BAClE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAMnD,CAAA;4BAED,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;gCACnD,MAAM,GAAG,CAAA;4BACX,CAAC;4BAED,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gCACzE,2DAA2D;gCAC3D,oCAAoC;gCACpC,MAAM,aAAa,GAAG,OAAO,EAAE,CAAC,aAAa,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,CAAA;gCAC/E,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;gCACrE,gEAAgE;gCAChE,2DAA2D;gCAC3D,gEAAgE;gCAChE,iEAAiE;gCACjE,MAAM,KAAK,GACT,UAAU,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;oCAC/C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC;oCAC5B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,GAAG,CAAC,CAAA;gCACtC,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;4BAC/C,CAAC;4BAED,IAAI,IAAI,IAAI,IAAI,IAAI,6BAA6B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gCACjE,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE;oCAC3D,MAAM;iCACP,CAAC,CAAA;4BACJ,CAAC;4BAED,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gCAC/D,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE;oCAC3D,MAAM;iCACP,CAAC,CAAA;4BACJ,CAAC;4BAED,MAAM,GAAG,CAAA;wBACX,CAAC,CAAC,CAAA;oBACJ,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBAClB,+DAA+D;wBAC/D,iEAAiE;wBACjE,2CAA2C;wBAC3C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;4BACnB,MAAO,MAAM,CAAC,MAA4B,IAAI,QAAQ,CAAA;wBACxD,CAAC;wBACD,MAAM,QAAQ,CAAA;oBAChB,CAAC;oBACD,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,CAAA;gBACtC,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAA;IACrD,MAAM,2BAA2B,GAAG,CAAC,GAAG,cAAc,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAA;IAa3F,SAAS,OAAO,CACd,GAAkB,EAClB,EACE,MAAM,EACN,MAAM,GAAG,aAAa,EACtB,UAAU,EACV,IAAI,EACJ,MAAM,EACN,OAAO,EACP,MAAM,GACoB;QAE5B,IAAI,UAAoB,CAAA;QACxB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,UAAU,GAAG,OAAO,CAAA;QACtB,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,UAAU,GAAG,EAAE,CAAA;YACf,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjD,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,qEAAqE;YACrE,6EAA6E;YAC7E,UAAU,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAA;QACjF,CAAC;QAED,IACE,SAAS;YACT,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EACpF,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;QAC1C,CAAC;QAED,IAAI,IAAI,GAAG,UAAU,CAAA;QAErB,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,GAAG,OAAO,CACZ,IAAI,EACJ,GAAG;iBACA,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;iBACvC,IAAI,CAAC,GAAG,CAAC,CACb,CAAA;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,IAAI,IAAI,WAAW,CAAC,SAAS,CAAC,MAA6B,CAAC,EAAE,CAAA;QACpE,CAAC;QAED,MAAM,GAAG,GAAG;YACV,IAAI;YACJ,MAAM,EAAE,QAAQ;YAChB,UAAU;YACV,MAAM;YACN,IAAI,EACF,IAAI,IAAI,IAAI;gBACZ,OAAO,IAAI,KAAK,QAAQ;gBACxB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACtB,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;gBACzB,CAAC,CAAC,IAAI,YAAY,WAAW,CAAC;gBAC9B,OAAQ,IAA2B,CAAC,IAAI,KAAK,UAAU;gBACrD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBACtB,CAAC,CAAC,IAAI;YACV,OAAO,EAAE,UAAU;SACpB,CAAA;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAsB;gBACjC,OAAO;gBACP,MAAM;gBACN,MAAM;gBACN,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,IAAI,WAAW,EAAE;gBAC1B,SAAS,CAAC,KAAK;oBACb,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;oBAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,OAAM;oBACR,CAAC;oBAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,KAAK,CAAE,MAAM,CAAC,MAA4B,IAAI,IAAI,UAAU,EAAE,CAAC,CAAA;wBAC/D,OAAM;oBACR,CAAC;oBAED,gEAAgE;oBAChE,sEAAsE;oBACtE,kDAAkD;oBAClD,MAAM,OAAO,GAAG,GAAG,EAAE;wBACnB,KAAK,CAAE,MAAM,CAAC,MAA4B,IAAI,IAAI,UAAU,EAAE,CAAC,CAAA;oBACjE,CAAC,CAAA;oBACD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAA;oBACpB,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBACnC,CAAC;gBACD,SAAS,CAAC,UAAU,EAAE,OAAO;oBAC3B,IAAI,CAAC,MAAM,GAAG,UAAU,CAAA;oBACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;gBACxB,CAAC;gBACD,MAAM,CAAC,KAAK;oBACV,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC3D,CAAC;gBACD,UAAU;oBACR,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBAC9B,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;oBAC9C,CAAC;oBAED,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;oBAElC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;oBAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;oBAErC,6DAA6D;oBAC7D,qEAAqE;oBACrE,qEAAqE;oBACrE,0BAA0B;oBAC1B,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,CAAA;oBACjD,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC3E,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;yBAChB,IAAI,EAAE;yBACN,WAAW,EAAE,CAAA;oBAEhB,mEAAmE;oBACnE,4DAA4D;oBAC5D,qEAAqE;oBACrE,gEAAgE;oBAChE,mEAAmE;oBACnE,oEAAoE;oBACpE,QAAQ;oBACR,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;wBAClC,IAAI,CAAC,MAAM,CACT,SAAS,CAAC,GAAG,EAAE;4BACb,MAAM;4BACN,OAAO,EAAE,UAAU;4BACnB,IAAI,EAAE,IAAI,CAAC,IAAI;yBAChB,CAAC,CACH,CAAA;wBACD,OAAM;oBACR,CAAC;oBAED,IAAI,IAAI,GAAY,IAAI,CAAC,IAAI,CAAA;oBAC7B,IAAI,WAAW,KAAK,kBAAkB,EAAE,CAAC;wBACvC,IAAI,CAAC;4BACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;wBAC9B,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,4DAA4D;4BAC5D,gEAAgE;4BAChE,gDAAgD;4BAChD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;4BACtF,OAAM;wBACR,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,OAAO,CAAC;wBACX,IAAI,EAAE,IAAS;wBACf,MAAM;wBACN,OAAO,EAAE,UAAU;qBACpB,CAAC,CAAA;gBACJ,CAAC;gBACD,OAAO,CAAC,GAAG;oBACT,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBAC9B,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;oBAC9C,CAAC;oBAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAClB,CAAC;aACF,CAAA;YAED,KAAK,QAAQ,CAAC,MAAM,EAAE,GAAiC,EAAE,OAAO,CAAC,CAAA;QACnE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,UAAU,QAAQ,CACrB,IAAa,EACb,OAAyB,EAAE;QAE3B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;QAC5E,MAAM,GAAG,GAAG;YACV,QAAQ,EAAE,YAAY;YACtB,MAAM;YACN,UAAU;YACV,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,MAAM;SACP,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAE5C,uEAAuE;QACvE,oEAAoE;QACpE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7C,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,GAAG,CAAC,IAA4B,CAAA;IACzC,CAAC;IAED,KAAK,UAAU,OAAO,CACpB,QAAyC,EACzC,OAAuB,EAAE;QAEzB,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7C,IAAI,GAAG,QAAQ,CAAA;YACf,QAAQ,GAAG,IAAI,CAAA;QACjB,CAAC;QAED,QAAQ,GAAG,QAAQ,IAAI,WAAW,CAAA;QAElC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,CAAA;QAEpF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAA;QAE3E,MAAM,GAAG,GAAG;YACV,QAAQ;YACR,MAAM;YACN,MAAM;YACN,UAAU;YACV,IAAI;YACJ,MAAM;YACN,OAAO;YACP,MAAM;SACP,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAE5C,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,GAAG,CAAC,IAA4B,CAAA;IACzC,CAAC;IAED,KAAK,UAAU,GAAG,CAChB,QAAuB,EACvB,MAAuC,EACvC,IAAc,EACd,EAAE,MAAM,GAAG,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,KAAuB,EAAE;QAE5F,MAAM,GAAG,GAAG;YACV,QAAQ;YACR,MAAM;YACN,MAAM;YACN,UAAU;YACV,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,OAAO;YACP,MAAM;SACP,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAE5C,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1C,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,GAAG,CAAC,IAAS,CAAA;IACtB,CAAC;IAED,KAAK,UAAU,IAAI,CACjB,QAAuB,EACvB,MAAuC,EACvC,IAAc,EACd,OAAyB,EAAE;QAE3B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;QAC3D,MAAM,GAAG,GAAG;YACV,QAAQ;YACR,MAAM;YACN,MAAM;YACN,UAAU;YACV,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO;YACP,MAAM;SACP,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAE5C,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1C,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,GAAG,CAAC,IAAS,CAAA;IACtB,CAAC;IAED,KAAK,UAAU,GAAG,CAChB,QAAuB,EACvB,MAAuC,EACvC,IAAc,EACd,EACE,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,EAC/B,MAAM,EACN,UAAU,GAAG,IAAI,EACjB,OAAO,GAAG,IAAI,MACM,EAAE;QAExB,MAAM,GAAG,GAAG;YACV,QAAQ;YACR,MAAM;YACN,MAAM;YACN,UAAU;YACV,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,OAAO;YACP,MAAM;SACP,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAE5C,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1C,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,GAAG,CAAC,IAAS,CAAA;IACtB,CAAC;IAED,KAAK,UAAU,OAAO,CACpB,QAAuB,EACvB,MAAuC,EACvC,IAAc,EACd,EAAE,MAAM,GAAG,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,KAAuB,EAAE;QAE5F,MAAM,GAAG,GAAG;YACV,QAAQ;YACR,MAAM;YACN,MAAM;YACN,UAAU;YACV,IAAI;YACJ,MAAM,EAAE,QAAQ;YAChB,OAAO;YACP,MAAM;SACP,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAE5C,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1C,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,GAAG,CAAC,IAAS,CAAA;IACtB,CAAC;IAED,KAAK,UAAU,IAAI,CACjB,MAAuC,EACvC,IAAc,EACd,EAAE,MAAM,GAAG,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,KAAuB,EAAE;QAE5F,MAAM,GAAG,GAAG;YACV,QAAQ,EAAE,IAAI;YACd,MAAM;YACN,MAAM;YACN,UAAU;YACV,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,OAAO;YACP,MAAM;SACP,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAE5C,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1C,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,GAAG,CAAC,IAAS,CAAA;IACtB,CAAC;IAED,KAAK,UAAU,EAAE,CAAC,EAChB,MAAM,GAAG,aAAa,EACtB,MAAM,MACkD,EAAE;QAC1D,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;YACzD,MAAM;YACN,UAAU,EAAE,MAAM;SACnB,CAAC,CAAA;QACF,OAAO,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAED,KAAK,UAAU,MAAM,CACnB,QAAgB;IAChB,2DAA2D;IAC3D,wEAAwE;IACxE,sDAAsD;IACtD,OAA0B,EAC1B,EACE,MAAM,GAAG,aAAa,EACtB,MAAM,MACsD,EAAE;QAGhE,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,GAA4B,CAAA;YAChC,IAAI,CAAC;gBACH,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAA4B,CAAA;YACxF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAK,GAA2B,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAChD,MAAM,GAAG,CAAA;gBACX,CAAC;gBACD,sEAAsE;gBACtE,kEAAkE;gBAClE,GAAG,GAAG;oBACJ,GAAG,EAAE,QAAQ;iBACd,CAAA;YACH,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAA;YACrB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAA;YAEvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;YAE3B,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAEnD,CAAA;YACH,CAAC;YAED,MAAM,CAAC,GAAG,GAAG,KAAK,CAAA;YAClB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAA;YAEpB,IAAI,CAAC;gBACH,OAAO;oBACL,GAAG,CAAC,MAAM,GAAG,CAA0B,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;oBACnF,GAAG,EAAE,MAAM;oBACX,OAAO,EAAE,IAAI;iBAC2B,CAAA;YAC5C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAK,GAA2B,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAChD,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,UAAU,KAAK;QAClB,MAAO,aAAuD,CAAC,KAAK,EAAE,CAAA;QACtE,mCAAmC;IACrC,CAAC;IAED,4EAA4E;IAC5E,mEAAmE;IACnE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC;QACnB,OAAO;QACP,QAAQ;QACR,OAAO;QACP,GAAG;QACH,IAAI;QACJ,GAAG;QACH,MAAM;QACN,MAAM,EAAE,OAAO;QACf,IAAI;QACJ,OAAO;QACP,KAAK;QACL,EAAE;KACmB,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,wBAAwB,CAAC,EAChC,SAAS,EACT,UAAU,EACV,UAAU,EACV,YAAY,EACZ,MAAM,EACN,GAAG,EACH,QAAQ,EACR,SAAS,EACT,cAAc,EACd,MAAM,EACN,OAAO,EACP,YAAY,EACZ,aAAa,EACb,KAAK,EACL,IAAI,EACJ,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,WAAW,EACX,GAAG,IAAI,EAC8D;IACrE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAC7D,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,MAAM,OAAO,GAA2B;QACtC,MAAM,EAAE,kBAAkB;KAC3B,CAAA;IAED,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,IAAI,CAAA;IAER,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,SAAS,GAAG,IAAI,CAAA;IACzB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,UAAU,GAAG,IAAI,CAAA;IAC1B,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,UAAU,GAAG,IAAI,CAAA;IAC1B,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,CAAC,YAAY,GAAG,IAAI,CAAA;IAC5B,CAAC;IAED,4EAA4E;IAC5E,2DAA2D;IAC3D,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAA;IAC1B,CAAC;IAED,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAClC,CAAC;IAED,IAAI,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QAC1C,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAA;IACzD,CAAC;IAED,4EAA4E;IAC5E,+EAA+E;IAC/E,4DAA4D;IAC5D,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,CAAC,cAAc,GAAG,cAAc,CAAA;IACxC,CAAC;IAED,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACtC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC,CAAA;IACnD,CAAC;IAED,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,CAAC,YAAY,GAAG,YAAY,CAAA;IACpC,CAAC;IAED,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAA;IACxC,CAAC;IAED,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IAED,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,WAAW,GAAG,WAAW,CAAA;IAClC,CAAC;IAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,MAAM,GAAG,MAAM,CAAA;QACf,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/B,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAA;IAC9C,CAAC;IAED,OAAO;QACL,MAAM;QACN,MAAM;QACN,OAAO;QACP,IAAI;KACL,CAAA;AACH,CAAC"}
import stream from 'node:stream';
import type { Dispatcher, LoggerLike, RequestOptions, URLObject } from '@nxtedition/nxt-undici';
import type { Priority } from './utils.ts';
export interface CouchResponse<T = unknown> {
rows: T[];
total_rows?: number;
offset?: number | null;
update_seq?: string;
}
export interface CouchRequestOptions<Stream extends boolean = boolean> {
id?: string;
url?: string | URL | URLObject;
pathname?: string;
path?: string;
origin?: string;
headers?: Record<string, string | string[] | null | undefined> | null;
method?: string;
body?: unknown;
query?: Record<string, unknown> | null;
headersTimeout?: number | null;
bodyTimeout?: number | null;
dispatcher?: Dispatcher | null;
priority?: Priority | null;
blocking?: boolean | null;
idempotent?: boolean | null;
retry?: RequestOptions['retry'];
dns?: RequestOptions['dns'];
cache?: RequestOptions['cache'];
signal?: AbortSignal | null;
logger?: LoggerLike | null;
highWaterMark?: number;
stream?: Stream;
}
export declare function request<T = unknown, Stream extends boolean = false>(url: string | URL | URLObject, opts?: CouchRequestOptions<Stream> | null): Stream extends true ? stream.Readable : Promise<T>;
export declare function request<T = unknown, Stream extends boolean = false>(opts: CouchRequestOptions<Stream>): Stream extends true ? stream.Readable : Promise<T>;
//# sourceMappingURL=request.d.ts.map
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,aAAa,CAAA;AAGhC,OAAO,KAAK,EAGV,UAAU,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAmN1C,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,mBAAmB,CAAC,MAAM,SAAS,OAAO,GAAG,OAAO;IACnE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,CAAA;IACrE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACtC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,GAAG,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAA;IAC3B,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAC3B,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAQD,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,KAAK,EACjE,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,EAC7B,IAAI,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAI,GACxC,MAAM,SAAS,IAAI,GAAG,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACrD,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,KAAK,EACjE,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAChC,MAAM,SAAS,IAAI,GAAG,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA"}
import assert from 'node:assert';
import net from 'node:net';
import stream from 'node:stream';
import { dispatch, Agent } from '@nxtedition/nxt-undici';
import { AbortError } from '@nxtedition/error';
class StreamOutput extends stream.Readable {
#str = '';
#resume;
#abort;
#state;
#decoder;
#headers;
constructor({ signal, highWaterMark = 256, }) {
super({ objectMode: true, highWaterMark, signal: signal ?? undefined });
}
get headers() {
return this.#headers;
}
_read() {
this.#resume?.();
}
_destroy(err, callback) {
this.#abort?.(err ?? undefined);
callback(err);
}
onConnect(abort) {
if (this.destroyed) {
abort(this.errored ?? undefined);
}
else if (this.#state) {
throw new Error('unusable');
}
else {
this.#state = 0;
this.#str = '';
this.#abort = abort;
this.#decoder = new TextDecoder();
}
}
onHeaders(statusCode, headers, resume) {
if (statusCode >= 300 || statusCode < 200) {
throw Object.assign(new Error('invalid status code: ' + statusCode), { statusCode, headers });
}
this.#headers = headers;
this.#resume = resume;
}
onData(data) {
const lines = this.#decoder.decode(data, { stream: true }).split(/\r?\n+/);
lines[0] = this.#str + lines[0];
this.#str = lines.pop() ?? '';
try {
let ret = true;
for (const line of lines) {
if (!line) {
continue;
}
if (this.#state === 0) {
if (/\[\s*$/.test(line)) {
this.#state = 1;
}
else {
throw new Error('expected [ at end of line');
}
}
else if (this.#state === 1) {
if (/^\s*\]/.test(line)) {
this.#state = 2;
}
else {
const row = JSON.parse(line.slice(0, line.lastIndexOf('}') + 1));
if (!this.push(row)) {
ret = false;
}
}
}
}
return ret;
}
catch (err) {
throw Object.assign(new Error('invalid data'), {
data: lines.join('\n') + this.#str,
cause: err,
});
}
}
onComplete() {
// A thrown assert here would be swallowed: nxt-undici treats the dispatch
// as settled once onComplete is entered, so the stream would neither end
// nor error — a permanent hang for the consumer. Destroy with a parse
// error instead when the body ended before the rows trailer.
const tail = this.#str + (this.#decoder ? this.#decoder.decode() : '');
if (this.#state === 1 && /^\s*\]/.test(tail)) {
this.#state = 2;
}
if (this.#state !== 2) {
this.destroy(Object.assign(new Error('invalid data'), { data: tail }));
return;
}
this.push(null);
}
onError(err) {
this.destroy(err);
}
}
class PromiseOutput {
#resolve;
#reject;
#str = '';
#decoder;
#signal;
#abort;
constructor({ resolve, reject, signal, }) {
this.#resolve = resolve;
this.#reject = reject;
this.#signal = signal;
}
onConnect(abort) {
this.#decoder = new TextDecoder();
this.#str = '';
const signal = this.#signal;
if (signal?.aborted) {
abort(signal.reason ?? new AbortError());
}
else if (signal) {
if (this.#abort) {
// A retried request calls onConnect again; drop the stale listener so
// it does not accumulate for every attempt.
signal.removeEventListener('abort', this.#abort);
}
// Wrap the undici abort callback: registering it directly would invoke
// it with the 'abort' Event object, which then propagates as the
// rejection "error".
this.#abort = () => {
abort(signal.reason ?? new AbortError());
};
signal.addEventListener('abort', this.#abort);
}
}
onHeaders(statusCode, rawHeaders, resume) {
if (statusCode >= 300 || statusCode < 200) {
throw Object.assign(new Error('invalid status code: ' + statusCode), {
statusCode,
headers: rawHeaders,
});
}
}
onData(data) {
this.#str += this.#decoder.decode(data, { stream: true });
}
onComplete() {
this.#str += this.#decoder.decode(undefined, { stream: false });
try {
this.#onDone(null, JSON.parse(this.#str));
}
catch (err) {
this.#onDone(Object.assign(new Error('invalid json'), { data: this.#str, cause: err }));
}
}
onError(err) {
this.#onDone(err);
}
#onDone(err, val) {
if (err) {
this.#reject(err);
}
else {
this.#resolve(val);
}
if (this.#abort) {
this.#signal?.removeEventListener('abort', this.#abort);
}
}
}
const defaultDispatcher = new Agent({
// pipelining: 4,
connections: 8 * 4,
connectTimeout: 2e3,
});
const blockingDispatcher = new Agent({
pipelining: 1,
connections: 1024,
connectTimeout: 2e3,
});
export function request(url, opts) {
let urlLike;
if (typeof url === 'string') {
opts = { url: new URL(url), ...opts };
}
else if (url instanceof URL) {
opts = { url, ...opts };
}
else if (url != null &&
typeof (url.path ?? url.pathname) === 'string' &&
(typeof url.origin === 'string' ||
url.host != null ||
url.hostname != null)) {
// A bare URL-like object ({ origin, path | pathname }); it may also carry
// request options when used in the opts-only calling convention.
urlLike = url;
opts = opts
? { ...url, ...opts }
: url;
}
if (opts == null && typeof url === 'object' && url != null) {
opts = url;
}
assert(opts != null, 'invalid arguments');
urlLike = opts.url ?? urlLike;
if (typeof urlLike === 'string') {
urlLike = new URL(urlLike);
}
assert(urlLike != null, 'invalid url');
let origin = urlLike.origin;
if (!origin) {
const protocol = urlLike.protocol ?? 'http:';
const rawHostname = urlLike.hostname;
// IPv6 literals must be bracketed in the authority or URL parsing fails.
const hostname = rawHostname != null && net.isIPv6(rawHostname) ? `[${rawHostname}]` : rawHostname;
const host = urlLike.host ??
`${hostname}:${urlLike.port ?? (protocol === 'https:' ? 443 : 80)}`;
origin = `${protocol}//${host}`;
}
let path = urlLike.path;
if (!path) {
const { pathname, search } = urlLike;
path = search ? `${pathname}${search}` : pathname;
}
// Only plain JSON values are serialized — Buffers, TypedArrays,
// ArrayBuffers and streams must pass through untouched or binary uploads
// would be corrupted into their JSON object representation.
const isJsonBody = opts.body != null &&
typeof opts.body === 'object' &&
!Buffer.isBuffer(opts.body) &&
!ArrayBuffer.isView(opts.body) &&
!(opts.body instanceof ArrayBuffer) &&
typeof opts.body.pipe !== 'function';
const ureq = {
...opts,
dns: opts.dns !== false && opts.dns !== null
? {
balance: 'hash',
...(typeof opts.dns === 'object' ? opts.dns : null),
}
: opts.dns,
origin,
path,
// Presence, not truthiness: a valid falsy body ('', 0, false, empty
// Buffer) must still default to POST rather than GET-with-a-body.
method: opts.method ?? (opts.body != null ? 'POST' : 'GET'),
blocking: opts.blocking ?? Boolean(opts.stream),
headers: {
'content-type': isJsonBody ? 'application/json' : 'text/plain',
accept: 'application/json',
// Lowercase caller header names so they override the defaults above —
// a spread of e.g. 'Content-Type' would otherwise ride along as a
// second, differently-cased content-type header on the wire.
...(opts.headers
? Object.fromEntries(Object.entries(opts.headers).map(([k, v]) => [k.toLowerCase(), v]))
: null),
},
cache: opts.cache ?? false,
body: isJsonBody ? JSON.stringify(opts.body) : opts.body,
};
const dispatcher = opts.dispatcher ?? (ureq.blocking ? blockingDispatcher : defaultDispatcher);
const signal = opts.signal;
if (opts.stream) {
const handler = new StreamOutput({ signal, highWaterMark: opts.highWaterMark });
void dispatch(dispatcher, ureq, handler);
return handler;
}
else {
return new Promise((resolve, reject) => {
const handler = new PromiseOutput({ resolve, reject, signal });
void dispatch(dispatcher, ureq, handler);
});
}
}
;
globalThis.__nxt_lib_couch = {
request,
defaultDispatcher,
};
//# sourceMappingURL=request.js.map
{"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"}
import type { DispatchOptions } from '@nxtedition/nxt-undici';
export type Priority = NonNullable<DispatchOptions['priority']>;
export interface AbortSignalLike {
aborted?: boolean;
reason?: unknown;
on?(event: 'abort', listener: () => void): void;
off?(event: 'abort', listener: () => void): void;
addEventListener?(event: 'abort', listener: () => void): void;
removeEventListener?(event: 'abort', listener: () => void): void;
addListener?(event: 'abort', listener: () => void): void;
removeListener?(event: 'abort', listener: () => void): void;
}
export declare function addAbortListener(signal: AbortSignalLike, listener: () => void): void;
export declare function removeAbortListener(signal: AbortSignalLike, listener: () => void): void;
//# sourceMappingURL=utils.d.ts.map
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAI7D,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAA;AAK/D,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAC/C,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAChD,gBAAgB,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAC7D,mBAAmB,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAChE,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IACxD,cAAc,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CAC5D;AAKD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAQpF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAQvF"}
// Registration/removal for AbortSignalLike. The probe orders mirror each
// other so a listener is always removed through the same style it was added
// with (EventEmitters alias on/addListener and off/removeListener).
export function addAbortListener(signal, listener) {
if (signal.addEventListener) {
signal.addEventListener('abort', listener);
}
else if (signal.on) {
signal.on('abort', listener);
}
else if (signal.addListener) {
signal.addListener('abort', listener);
}
}
export function removeAbortListener(signal, listener) {
if (signal.removeEventListener) {
signal.removeEventListener('abort', listener);
}
else if (signal.off) {
signal.off('abort', listener);
}
else if (signal.removeListener) {
signal.removeListener('abort', listener);
}
}
//# sourceMappingURL=utils.js.map
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAoBA,yEAAyE;AACzE,4EAA4E;AAC5E,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,MAAuB,EAAE,QAAoB;IAC5E,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC5C,CAAC;SAAM,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC9B,CAAC;SAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAuB,EAAE,QAAoB;IAC/E,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAC/B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC/C,CAAC;SAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC/B,CAAC;SAAM,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
+153
-129

@@ -1,139 +0,163 @@

import type { Logger } from '@nxtedition/logger'
import type { Readable } from 'node:stream'
import type { Dispatcher } from 'undici'
import type { Priority } from '@nxtedition/scheduler'
export interface CouchOptions {
url?: string
import type { Dispatcher, LoggerLike } from '@nxtedition/nxt-undici';
import { type AbortSignalLike, type Priority } from './utils.ts';
export type { AbortSignalLike } from './utils.ts';
export { request } from './request.ts';
export type { CouchResponse, CouchRequestOptions } from './request.ts';
export interface CouchConfig {
url?: string | string[];
name?: string;
userAgent?: string;
getClient?: (pathname: string) => Dispatcher;
couchdb?: CouchOptions;
couch?: CouchOptions;
config?: CouchConfig;
}
export function makeCouch(opts: string | CouchOptions): CouchClient
export interface CouchRequestOptions<Stream extends boolean = false> {
id?: string
url?: URL
pathname?: string
path?: string
headers?: Record<string, string>
method?: string
body?: unknown
headersTimeout?: number
bodyTimeout?: number
dispatcher?: Dispatcher
priority?: Priority
query?: {
key?: string
startkey?: string
endkey?: string
update?: boolean
seq?: string
}
blocking?: boolean
seq?: string
signal?: AbortSignal
logger?: Logger
stream?: Stream
// TODO add more or extend undicii type?
export type CouchOptions = string | string[] | CouchConfig;
export interface CouchCallOptions {
client?: Dispatcher;
signal?: AbortSignalLike | null;
idempotent?: boolean;
headers?: Record<string, string> | string[] | null;
}
export interface CouchResponse<T> {
rows: T[]
export interface CouchClientRequestOptions extends CouchCallOptions {
params?: Record<string, unknown> | null;
body?: unknown;
method?: string;
}
export function request<T, Stream extends boolean = false>(
url: string | URL | { origin: string; path?: string; pathname?: string },
opts?: CouchRequestOptions<Stream> | null,
): Stream extends true ? Readable : Promise<CouchResponse<T>>
interface ChangesOptions {
signal?: AbortSignal | null
descending?: boolean
include_docs?: boolean
seq_interval?: number | null
live?: boolean
heartbeat?: number
retry?: (
err: unknown,
retryCount: number,
params: {
since?: string | 0 | null
},
ac: { signal: AbortSignal },
next: () => void,
) => void | null | Promise<void>
since?: string | 0 | null
selector?: object | null
highWaterMark?: number
priority?: Priority
export interface CouchRequestResult<T = unknown> {
data: T;
status: number;
headers: Record<string, string | string[]>;
}
interface ChangeItem {
id: string
seq?: string
doc?: object
deleted?: boolean
changes: Array<{ rev: string }>
export interface ChangeItem {
id: string;
seq?: string | null;
doc?: Record<string, unknown> | null;
deleted?: boolean;
changes: Array<{
rev: string;
}>;
}
export interface AllDocsOptions {
client?: unknown
signal?: AbortSignal
idempotent?: boolean
conflicts?: boolean
update_seq?: boolean
descending?: boolean
include_docs?: boolean
sorted?: boolean
key?: string
keys?: string[]
startkey?: string
start_key?: string
startkey_docid?: string
endkey?: string
end_key?: string
endkey_docid?: string
inclusive_end?: boolean
limit?: number
skip?: number
stale?: string
reduce?: boolean
stable?: boolean
update?: boolean
group?: boolean
group_level?: number
export type ChangeBatch = ChangeItem[] & {
lastSeq?: string | 0 | null;
};
export interface ChangesRetryState {
since: string | 0 | null | undefined;
time: number;
count: number;
}
// A _all_docs row is either a found row (id/value/doc present) or, in `keys`
// mode, an error row for a key that does not exist (`{ key, error }`, no doc).
// With include_docs a deleted doc has `doc: null`.
export interface AllDocsRow<Doc = Record<string, unknown>> {
id?: string
key: string
value?: { rev: string; deleted?: boolean }
doc?: Doc | null
error?: string
export type ChangesRetryFn = (err: unknown, retryCount: number, state: ChangesRetryState, ctx: {
signal: AbortSignal;
logger?: LoggerLike | null;
}, next: () => boolean | Promise<boolean>) => unknown;
export interface ChangesOptions {
client?: Dispatcher;
signal?: AbortSignalLike | null;
logger?: LoggerLike | null;
conflicts?: boolean;
descending?: boolean;
include_docs?: boolean;
seq_interval?: number | null;
/** Start sequence. Mutated retry state is reported per batch via `lastSeq`. */
since?: string | 0 | null;
until?: string | null;
style?: string;
view?: string;
filter?: string;
/** Continuous-feed heartbeat interval in milliseconds. Defaults to 60000. */
heartbeat?: number;
timeout?: number;
limit?: number;
doc_ids?: string[];
selector?: object | null;
/** Defaults to `true` (continuous feed) when omitted. */
live?: boolean;
retry?: ChangesRetryFn | null;
highWaterMark?: number;
priority?: Priority | null;
}
export interface AllDocsResponse<Doc = Record<string, unknown>> {
total_rows?: number
offset?: number | null
update_seq?: string
rows: Array<AllDocsRow<Doc>>
export interface AllDocsOptions extends Omit<CouchCallOptions, 'headers'> {
conflicts?: boolean;
update_seq?: boolean;
descending?: boolean;
include_docs?: boolean;
sorted?: boolean;
key?: unknown;
keys?: unknown[];
startkey?: unknown;
start_key?: unknown;
startkey_docid?: string;
endkey?: unknown;
end_key?: unknown;
endkey_docid?: string;
inclusive_end?: boolean;
limit?: number;
skip?: number;
stale?: string;
reduce?: boolean;
stable?: boolean;
update?: boolean | string;
group?: boolean;
group_level?: number;
}
export interface AllDocsRow<Doc = Record<string, unknown>, Value = {
rev: string;
deleted?: boolean;
}> {
id?: string;
key: unknown;
value?: Value;
doc?: Doc | null;
error?: string;
}
export interface AllDocsResponse<Doc = Record<string, unknown>, Value = {
rev: string;
deleted?: boolean;
}> {
total_rows?: number;
offset?: number | null;
update_seq?: string;
rows: Array<AllDocsRow<Doc, Value>>;
}
export interface BulkDocsResultItem {
ok?: boolean;
id: string;
rev?: string;
error?: string;
reason?: string;
}
export interface UpsertResult<Doc = Record<string, unknown>> {
updated: boolean;
id?: string;
rev?: string;
ok?: boolean;
doc: Doc;
}
export interface CouchClient {
changes: (
options?: ChangesOptions & { client?: unknown; logger?: Logger },
) => AsyncGenerator<ChangeItem[] & { lastSeq?: string | 0 | null }, void, unknown>
allDocs: <Doc = Record<string, unknown>>(options: AllDocsOptions) => Promise<AllDocsResponse<Doc>>
allDocs: <Doc = Record<string, unknown>>(
pathname: string,
options?: AllDocsOptions,
) => Promise<AllDocsResponse<Doc>>
allDocs: <Doc = Record<string, unknown>>(
pathnameOrOptions?: string | AllDocsOptions,
options?: AllDocsOptions,
) => Promise<AllDocsResponse<Doc>>
up: (opts?: { client?: unknown; signal?: AbortSignal }) => Promise<unknown>
close: () => Promise<void>
url: URL;
request<T = unknown>(url: string | null, opts: CouchClientRequestOptions): Promise<CouchRequestResult<T>>;
bulkDocs<T = unknown>(body: {
docs: T[];
new_edits?: boolean;
}, opts?: CouchCallOptions): Promise<BulkDocsResultItem[]>;
allDocs<Doc = Record<string, unknown>>(options?: AllDocsOptions): Promise<AllDocsResponse<Doc>>;
allDocs<Doc = Record<string, unknown>>(pathname: string | null, options?: AllDocsOptions): Promise<AllDocsResponse<Doc>>;
put<T = unknown>(pathname: string | null, params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>;
post<T = unknown>(pathname: string | null, params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>;
get<T = unknown>(pathname: string | null, params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>;
delete<T = unknown>(pathname: string | null, params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>;
info<T = Record<string, unknown>>(params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>;
upsert<Doc = Record<string, unknown>>(pathname: string, diffFun: (doc: Doc) => Doc | null | undefined | false, opts?: {
client?: Dispatcher;
signal?: AbortSignalLike | null;
}): Promise<UpsertResult<Doc>>;
changes(options?: ChangesOptions): AsyncGenerator<ChangeBatch, void, unknown>;
up(opts?: {
client?: Dispatcher;
signal?: AbortSignal | null;
}): Promise<unknown>;
close(): Promise<void>;
}
export declare const CHANGES_RETRYABLE_ERROR_CODES: readonly string[];
export declare function makeCouch(opts: CouchOptions): CouchClient;
//# sourceMappingURL=index.d.ts.map
+827
-1183

@@ -1,1238 +0,882 @@

import assert from 'node:assert'
import stream from 'node:stream'
import querystring from 'node:querystring'
import tp from 'node:timers/promises'
import createError from 'http-errors'
import urljoin from 'url-join'
import urlJoin from 'url-join'
import { dispatch, Agent, Pool, request as undiciRequest } from '@nxtedition/nxt-undici'
import { makeWeakCache } from '@nxtedition/weak-cache'
import { AbortError } from '@nxtedition/error'
/**
* @typedef {import('@nxtedition/scheduler').Priority} Priority
*/
import assert from 'node:assert';
import querystring from 'node:querystring';
import tp from 'node:timers/promises';
import createError from 'http-errors';
import urlJoin from 'url-join';
import { dispatch, Pool, request as undiciRequest } from '@nxtedition/nxt-undici';
import { makeWeakCache } from '@nxtedition/weak-cache';
import { AbortError } from '@nxtedition/error';
import { addAbortListener, removeAbortListener, } from "./utils.js";
export { request } from "./request.js";
// Transport-level error codes the default changes() retry treats as
// reconnectable. Exported so custom retry callbacks can reuse the list.
export const CHANGES_RETRYABLE_ERROR_CODES = Object.freeze([
'ECONNRESET',
'ECONNREFUSED',
'ENOTFOUND',
'ENETDOWN',
'ENETUNREACH',
'EHOSTDOWN',
'EHOSTUNREACH',
'EPIPE',
'EAI_AGAIN',
'ENODATA',
'UND_ERR_CONNECT_TIMEOUT',
'UND_ERR_SOCKET',
// The whole point of bodyTimeout = 2 * heartbeat (and the fixed 2-minute
// headersTimeout) is to detect a silently dead connection (no FIN/RST);
// reconnecting from params.since is the loop's normal recovery path, and the
// 2-minute give-up still bounds persistent failure.
'UND_ERR_BODY_TIMEOUT',
'UND_ERR_HEADERS_TIMEOUT',
]);
export function makeCouch(opts) {
let config
if (typeof opts === 'string') {
config = opts
} else if (Array.isArray(opts)) {
config = opts
} else if (opts?.url) {
config = opts
} else if (opts?.couchdb || opts?.couch) {
config = opts.couchdb || opts.couch
} else if (opts?.config) {
config = opts.config.couchdb || opts.config.couch || opts.config
} else {
throw new Error('invalid options')
}
if (typeof config === 'string') {
config = { url: config }
}
if (!config.url && config.name) {
config = { ...config, url: config.name }
}
const { origin: dbOrigin, pathname: dbPathname } = new URL(
Array.isArray(config.url) ? config.url[0] : config.url,
)
const defaultClientOpts = {
connectTimeout: 2e3,
}
const userAgent = config.userAgent || globalThis.userAgent
const defaultClient = new Pool(dbOrigin, defaultClientOpts)
const getClient =
config.getClient ??
makeWeakCache(
() =>
new Pool(dbOrigin, {
...defaultClientOpts,
connections: 4, // TODO (fix): Global limit?
pipelining: 2,
}),
)
function makeError(req, res) {
let path
if (req.path) {
path = req.path
} else {
path = dbPathname
if (req.pathname) {
path = urljoin(path, req.pathname)
}
if (req.params) {
path += `?${querystring.stringify(req.params)}`
}
let config;
if (typeof opts === 'string' || Array.isArray(opts)) {
config = opts;
}
let reason
let error
try {
const json = typeof res.data === 'string' ? JSON.parse(res.data) : res.data
reason = json.reason
error = json.error
} catch {
// Do nothing...
else if (opts?.url) {
config = opts;
}
return createError(res.status, {
reason,
error,
data: {
req: {
origin: dbOrigin,
path,
method: req.method,
headers: req.headers,
body: req.body ? JSON.stringify(req.body).slice(0, 4096) : null,
},
res: {
status: res.status,
headers: res.headers,
body: res.data,
},
},
})
}
/**
* @param {Object} [options={}]
* @param {AbortSignal} [options.signal]
* @param {boolean} [options.descending=false]
* @param {boolean} [options.include_docs=false]
* @param {number} [options.seq_interval=null]
* @param {boolean} [options.live=false]
* @param {number} [options.heartbeat=60000]
* @param {function} [options.retry=null]
* @param {0|string|null} [options.since=null]
* @param {object} [options.selector=null]
* @param {number} [options.highWaterMark=128 * 1024]
* @param {Priority} [options.priority=null]
* @param {import('pino').Logger} [options.logger=null]
* @return {AsyncGenerator<Array<{ id: string, seq?: string, doc?: Object, deleted?: boolean, changes: Array<{ rev: string }>}> & { lastSeq: string | null | 0 }}
*/
async function* changes({ client = defaultClient, signal, logger, ...options } = {}) {
const params = {}
let body
let method = 'GET'
if (options.conflicts) {
params.conflicts = true
else if (opts?.couchdb || opts?.couch) {
config = (opts.couchdb || opts.couch);
}
if (options.descending) {
params.descending = true
else if (opts?.config) {
config = opts.config.couchdb || opts.config.couch || opts.config;
}
if (options.include_docs) {
params.include_docs = true
else {
throw new Error('invalid options');
}
if (options.seq_interval != null) {
params.seq_interval = options.seq_interval
if (typeof config === 'string' || Array.isArray(config)) {
config = { url: config };
}
if (options.since != null) {
params.since = options.since
if (!config.url && config.name) {
config = { ...config, url: config.name };
}
if (options.until != null) {
params.until = options.until
// Validate before constructing: an empty url array (or empty string) would
// otherwise surface as a low-signal 'Invalid URL' TypeError.
const dbUrl = Array.isArray(config.url) ? config.url[0] : config.url;
if (!dbUrl) {
throw new Error('invalid options');
}
if (options.style != null) {
params.style = options.style
const { origin: dbOrigin, pathname: dbPathname } = new URL(dbUrl);
const defaultClientOpts = {
connectTimeout: 2e3,
};
const userAgent = config.userAgent || globalThis.userAgent;
const defaultClient = new Pool(dbOrigin, defaultClientOpts);
const getClient = config.getClient ??
makeWeakCache((_pathname) => new Pool(dbOrigin, {
...defaultClientOpts,
connections: 4, // TODO (fix): Global limit?
pipelining: 2,
}));
function makeError(req, res) {
let path;
if (req.path) {
path = req.path;
}
else {
path = dbPathname;
if (req.pathname) {
path = urlJoin(path, req.pathname);
}
if (req.params) {
path += `?${querystring.stringify(req.params)}`;
}
}
let reason;
let error;
try {
const json = (typeof res.data === 'string' ? JSON.parse(res.data) : res.data);
reason = json.reason;
error = json.error;
}
catch {
// Do nothing...
}
return createError(res.status, {
reason,
error,
data: {
req: {
origin: dbOrigin,
path,
method: req.method,
headers: req.headers,
// req.body is usually already a serialized JSON string; stringifying
// again would quote/escape it and make log payloads harder to read.
body: req.body != null
? (typeof req.body === 'string' ? req.body : JSON.stringify(req.body)).slice(0, 4096)
: null,
},
res: {
status: res.status,
headers: res.headers,
body: res.data,
},
},
});
}
if (options.view != null) {
params.view = options.view
}
if (options.filter != null) {
params.filter = options.filter
}
if (options.heartbeat != null) {
params.heartbeat = Number(options.heartbeat)
} else {
params.heartbeat = 60e3
}
if (options.timeout != null) {
params.timeout = options.timeout
}
if (options.limit != null) {
params.limit = options.limit
}
if (options.doc_ids != null) {
method = 'POST'
body = { ...body, doc_ids: options.doc_ids }
params.filter = '_doc_ids'
}
if (options.selector != null) {
method = 'POST'
body = { ...body, selector: options.selector }
params.filter = '_selector'
}
if (dbPathname === '/') {
throw new Error('invalid pathname')
}
const ac = new AbortController()
const onAbort = () => {
ac.abort()
}
if (signal) {
if (signal.aborted) {
throw signal.reason ?? new AbortError()
}
if (signal.on) {
signal.on('abort', onAbort)
} else if (signal.addEventListener) {
signal.addEventListener('abort', onAbort)
}
}
const highWaterMark = options.highWaterMark || 128 * 1024
const live = options.live == null || !!options.live
const retry =
options.retry ??
(async (err, retryCount, params, { signal, logger }, next) => {
logger?.error({ err, retryCount, params }, 'changes error')
return next()
})
const priority = options.priority ?? null
try {
yield* _changes({
method,
live,
retry,
highWaterMark,
params,
body,
signal: ac.signal,
client,
logger,
priority,
})
} finally {
ac.abort()
if (signal) {
if (signal.off) {
signal.off('abort', onAbort)
} else if (signal.removeEventListener) {
signal.removeEventListener('abort', onAbort)
async function* changes({ client = defaultClient, signal, logger, ...options } = {}) {
const params = {};
let body;
let method = 'GET';
if (options.conflicts) {
params.conflicts = true;
}
}
if (options.descending) {
params.descending = true;
}
if (options.include_docs) {
params.include_docs = true;
}
if (options.seq_interval != null) {
params.seq_interval = options.seq_interval;
}
if (options.since != null) {
params.since = options.since;
}
if (options.until != null) {
params.until = options.until;
}
if (options.style != null) {
params.style = options.style;
}
if (options.view != null) {
params.view = options.view;
}
if (options.filter != null) {
params.filter = options.filter;
}
// CouchDB only applies the `view` param when filter=_view is set; without
// it the feed is silently unfiltered.
if (params.view != null) {
params.filter ??= '_view';
}
if (options.heartbeat != null) {
params.heartbeat = Number(options.heartbeat);
}
else {
params.heartbeat = 60e3;
}
if (options.timeout != null) {
params.timeout = options.timeout;
}
if (options.limit != null) {
params.limit = options.limit;
}
if (options.doc_ids != null) {
method = 'POST';
body = { ...body, doc_ids: options.doc_ids };
params.filter = '_doc_ids';
}
if (options.selector != null) {
method = 'POST';
body = { ...body, selector: options.selector };
params.filter = '_selector';
}
if (dbPathname === '/') {
throw new Error('invalid pathname');
}
const ac = new AbortController();
const onAbort = () => {
// Forward the caller's abort reason so downstream rejections match it
// (undefined falls back to the default AbortError).
ac.abort(signal?.reason);
};
if (signal) {
if (signal.aborted) {
throw signal.reason ?? new AbortError();
}
addAbortListener(signal, onAbort);
}
const highWaterMark = options.highWaterMark || 128 * 1024;
const live = options.live == null || !!options.live;
const retry = options.retry ??
(async (err, retryCount, params, { logger }, next) => {
logger?.error({ err, retryCount, params }, 'changes error');
return next();
});
const priority = options.priority ?? null;
try {
yield* _changes({
method,
live,
retry,
highWaterMark,
params,
body,
signal: ac.signal,
client,
logger,
priority,
});
}
finally {
ac.abort();
if (signal) {
removeAbortListener(signal, onAbort);
}
}
}
}
async function* _changes({
live,
retry,
params,
method,
body,
signal,
client,
logger,
highWaterMark = 128 * 1024,
blocking = live || !params.limit || params.limit > 256,
priority,
}) {
const startSeq = params.since || null
// NOTE: Pass the URL as the first argument and the dispatcher in the options
// object so nxt-undici uses the configured `client` instead of the ambient
// global dispatcher (which may be Node's built-in undici, whose handler
// interface is incompatible). See `up()` for the same pattern.
const { update_seq: updateSeq } = await undiciRequest(new URL(dbPathname, dbOrigin), {
signal,
dispatcher: client,
}).then((res) => res.body.json())
let retryCount = 0
let retryTime = 0
while (true) {
let src
try {
const query = { ...params, feed: live ? 'continuous' : 'normal' }
// NOTE: URL as the first argument, everything else (including the
// dispatcher) in the options object — see the update_seq probe above.
const ures = await undiciRequest(new URL(urlJoin(dbPathname, '/_changes'), dbOrigin), {
query,
headers: body
? {
'content-type': 'application/json',
}
: null,
blocking,
method,
body: JSON.stringify(body),
retry: false,
idempotent: false,
signal,
headersTimeout: 2 * 60e3,
bodyTimeout: 2 * (params.heartbeat || 60e3),
highWaterMark,
dispatcher: client,
logger,
priority,
})
retryCount = 0
retryTime = 0
src = ures.body
const changes = []
let resume = null
let error = null
let ended = false
let state = 0
let since = params.since || null
function maybeResume() {
if (resume) {
resume()
resume = null
}
}
src
.on('readable', maybeResume)
.on('error', (err) => {
error = err
maybeResume()
})
.on('end', () => {
ended = true
maybeResume()
})
.on('close', maybeResume)
const decoder = new TextDecoder('utf-8')
let str = ''
async function* _changes({ live, retry, params, method, body, signal, client, logger, highWaterMark = 128 * 1024, blocking = live || !params.limit || params.limit > 256, priority, }) {
const startSeq = params.since || null;
// Fetched lazily inside the retry loop (undefined = not yet fetched,
// null = fetched but absent) so a failing probe at feed start goes
// through the same retry contract as the _changes request itself.
let updateSeq;
let retryCount = 0;
let retryTime = 0;
while (true) {
const chunk = src.read()
let text = null
if (chunk != null) {
text = decoder.decode(chunk, { stream: true })
} else if (ended) {
text = decoder.decode() || null
}
if (text != null) {
const lines = (str + text).split(/\r?\n/)
str = lines.pop() ?? ''
for (const line of lines) {
if (line === '') {
// Do nothing. Empty lines due to e.g. heartbeat.
} else if (line === ',') {
// Do nothing. Couch sometimes insert new line between json body and comma.
} else if (live) {
const data = JSON.parse(line)
if (data.last_seq) {
since = data.last_seq
} else {
since = data.seq || since
changes.push(data)
let src;
try {
if (updateSeq === undefined) {
// NOTE: Pass the URL as the first argument and the dispatcher in the
// options object so nxt-undici uses the configured `client` instead
// of the ambient global dispatcher (which may be Node's built-in
// undici, whose handler interface is incompatible). retry: false so
// error classification is owned by this loop's catch, like _changes.
const info = (await undiciRequest(new URL(dbPathname, dbOrigin), {
signal,
dispatcher: client,
retry: false,
}).then((res) => res.body.json()));
updateSeq = info.update_seq ?? null;
}
} else {
// NOTE: This makes some assumptions about the format of the JSON.
if (state === 0) {
if (line.endsWith('[')) {
state = 1
} else {
assert(false, 'invalid head: ' + line)
}
} else if (state === 1) {
if (line.startsWith(']')) {
state = 2
} else {
const idx = line.lastIndexOf('}') + 1
const query = { ...params, feed: live ? 'continuous' : 'normal' };
// NOTE: URL as the first argument, everything else (including the
// dispatcher) in the options object — see the update_seq probe above.
const ures = await undiciRequest(new URL(urlJoin(dbPathname, '/_changes'), dbOrigin), {
query,
headers: body
? {
'content-type': 'application/json',
}
: null,
blocking,
method,
body: JSON.stringify(body),
retry: false,
idempotent: false,
signal,
headersTimeout: 2 * 60e3,
bodyTimeout: 2 * (params.heartbeat || 60e3),
highWaterMark,
dispatcher: client,
logger,
priority,
});
retryCount = 0;
retryTime = 0;
src = ures.body;
const changes = [];
let resume = null;
let error = null;
let ended = false;
let state = 0;
let since = params.since || null;
function maybeResume() {
if (resume) {
resume();
resume = null;
}
}
src
.on('readable', maybeResume)
.on('error', (err) => {
error = err;
maybeResume();
})
.on('end', () => {
ended = true;
maybeResume();
})
.on('close', maybeResume);
const decoder = new TextDecoder('utf-8');
let str = '';
while (true) {
const chunk = src.read();
let text = null;
if (chunk != null) {
text = decoder.decode(chunk, { stream: true });
}
else if (ended) {
text = decoder.decode() || null;
}
if (text != null) {
const lines = (str + text).split(/\r?\n/);
str = lines.pop() ?? '';
for (const line of lines) {
if (line === '') {
// Do nothing. Empty lines due to e.g. heartbeat.
}
else if (line === ',') {
// Do nothing. Couch sometimes insert new line between json body and comma.
}
else if (live) {
const data = JSON.parse(line);
if (data.last_seq) {
since = data.last_seq;
}
else {
since = data.seq || since;
changes.push(data);
}
}
else {
// NOTE: This makes some assumptions about the format of the JSON.
if (state === 0) {
if (line.endsWith('[')) {
state = 1;
}
else {
assert(false, 'invalid head: ' + line);
}
}
else if (state === 1) {
if (line.startsWith(']')) {
state = 2;
}
else {
const idx = line.lastIndexOf('}') + 1;
try {
assert(idx > 0, 'invalid row: ' + idx + ' ' + line);
const change = JSON.parse(line.slice(0, idx));
since = change.seq || since;
changes.push(change);
}
catch (err) {
throw Object.assign(err, { data: line });
}
}
}
else if (state === 2) {
state = 3;
since = JSON.parse('{' + line).last_seq;
assert(since, 'invalid trailer: ' + line);
}
}
}
}
else if (changes.length) {
const ret = changes.splice(0);
ret.lastSeq = params.since = since;
yield ret;
// Shrink the remaining cap so a reconnect only ever asks for the
// remainder — re-sending the original limit after a mid-feed retry
// would deliver more rows than the caller requested.
if (params.limit != null) {
params.limit -= ret.length;
if (params.limit <= 0) {
return;
}
}
}
else if (error) {
// Cast: `error` is assigned from a stream callback, so the linter
// cannot narrow Error | null through the truthiness guard above.
throw error;
}
else if (!ended) {
await new Promise((resolve) => {
resume = resolve;
});
}
else {
if (since === startSeq && params.limit == null) {
since = params.until || updateSeq || null;
}
const ret = changes.splice(0);
ret.lastSeq = params.since = since;
yield ret;
return;
}
}
}
catch (err) {
// signal.aborted covers caller-provided abort reasons whose name is
// not 'AbortError' — those must terminate the feed, not enter retry.
if (signal.aborted || err?.name === 'AbortError' || !retry) {
throw err;
}
else {
logger?.error({ err }, 'changes error');
retryTime ||= Date.now();
const retryState = { since: params.since, time: retryTime, count: retryCount };
try {
assert(idx > 0, 'invalid row: ' + idx + ' ' + line)
const change = JSON.parse(line.slice(0, idx))
since = change.seq || since
changes.push(change)
} catch (err) {
throw Object.assign(err, { data: line })
await retry(err, retryCount++, retryState, { signal, logger }, () => {
const { statusCode, code, message, headers, res } = err;
if (retryTime && Date.now() - retryTime > 2 * 60e3) {
throw err;
}
if (statusCode != null && [420, 429, 502, 503, 504].includes(statusCode)) {
// nxt-undici decorates response errors with the headers on
// err.res.headers, not err.headers.
const retryAfterRaw = headers?.['retry-after'] ?? res?.headers?.['retry-after'];
const retryAfter = retryAfterRaw ? Number(retryAfterRaw) * 1e3 : null;
// Clamp the server-controlled delay (same bound as nxt-undici's
// response-retry): a hostile/huge value would overflow the
// 32-bit timer and fire after ~1ms — a hot reconnect loop — and
// even a valid large value must not exceed the 2-minute give-up.
const delay = retryAfter != null && Number.isFinite(retryAfter)
? Math.min(retryAfter, 60e3)
: Math.min(10e3, retryCount * 1e3);
return tp.setTimeout(delay, true, { signal });
}
if (code != null && CHANGES_RETRYABLE_ERROR_CODES.includes(code)) {
return tp.setTimeout(Math.min(10e3, retryCount * 1e3), true, {
signal,
});
}
if (message != null && ['other side closed'].includes(message)) {
return tp.setTimeout(Math.min(10e3, retryCount * 1e3), true, {
signal,
});
}
throw err;
});
}
}
} else if (state === 2) {
state = 3
since = JSON.parse('{' + line).last_seq
assert(since, 'invalid trailer: ' + line)
catch (retryErr) {
// Aborting during the retry sleep rejects tp.setTimeout with a
// generic AbortError; surface the caller's abort reason instead,
// matching the in-flight abort path above.
if (signal.aborted) {
throw signal.reason ?? retryErr;
}
throw retryErr;
}
params.since = retryState.since ?? 0;
}
}
}
} else if (changes.length) {
const ret = changes.splice(0)
ret.lastSeq = params.since = since
yield ret
} else if (error) {
throw error
} else if (!ended) {
await new Promise((resolve) => {
resume = resolve
})
} else {
if (since === startSeq && params.limit == null) {
since = params.until || updateSeq
finally {
src?.on('error', () => { }).destroy();
}
const ret = changes.splice(0)
ret.lastSeq = params.since = since
yield ret
return
}
}
} catch (err) {
if (err.name === 'AbortError' || !retry) {
throw err
} else {
logger?.error({ err }, 'changes error')
retryTime ||= Date.now()
const retryState = { since: params.since, time: retryTime, count: retryCount }
await retry(err, retryCount++, retryState, { signal, logger }, () => {
const { statusCode, code, message, headers } = err
if (retryTime && Date.now() - retryTime > 2 * 60e3) {
throw err
}
const ACCEPT_HEADERS = ['Accept', 'application/json'];
const ACCEPT_CONTENT_TYPE_HEADERS = [...ACCEPT_HEADERS, 'Content-Type', 'application/json'];
function request(url, { params, client = defaultClient, idempotent, body, method, headers, signal, }) {
let headerList;
if (Array.isArray(headers)) {
headerList = headers;
}
else if (headers) {
headerList = [];
for (const [key, val] of Object.entries(headers)) {
headerList.push(key, val);
}
if (statusCode && [420, 429, 502, 503, 504].includes(statusCode)) {
const retryAfter = headers?.['retry-after']
? Number(headers['retry-after']) * 1e3
: null
const delay =
retryAfter != null && Number.isFinite(retryAfter)
? retryAfter
: Math.min(10e3, retryCount * 1e3)
return tp.setTimeout(delay, true, { signal })
}
if (
[
'ECONNRESET',
'ECONNREFUSED',
'ENOTFOUND',
'ENETDOWN',
'ENETUNREACH',
'EHOSTDOWN',
'EHOSTUNREACH',
'EPIPE',
'EAI_AGAIN',
'ENODATA',
'UND_ERR_CONNECT_TIMEOUT',
'UND_ERR_SOCKET',
].includes(code)
) {
return tp.setTimeout(Math.min(10e3, retryCount * 1e3), true, {
}
else {
// Copy the shared default array: the user-agent append below mutates
// `headerList` in place, which must not leak into the module-level constant.
headerList = [...(body != null ? ACCEPT_CONTENT_TYPE_HEADERS : ACCEPT_HEADERS)];
}
if (userAgent &&
!headerList.some((element, index) => index % 2 === 0 && /user-agent/i.test(element))) {
headerList.push('user-agent', userAgent);
}
let path = dbPathname;
if (url) {
path = urlJoin(path, url
.split('/')
.map((part) => encodeURIComponent(part))
.join('/'));
}
if (params) {
path += `?${querystring.stringify(params)}`;
}
const req = {
path,
origin: dbOrigin,
idempotent,
method,
body: body != null &&
typeof body === 'object' &&
!Buffer.isBuffer(body) &&
!ArrayBuffer.isView(body) &&
!(body instanceof ArrayBuffer) &&
typeof body.pipe !== 'function'
? JSON.stringify(body)
: body,
headers: headerList,
};
return new Promise((resolve, reject) => {
const handler = {
resolve,
reject,
signal,
})
}
if (['other side closed'].includes(message)) {
return tp.setTimeout(Math.min(10e3, retryCount * 1e3), true, {
signal,
})
}
throw err
})
params.since = retryState.since ?? 0
status: null,
headers: null,
abort: null,
data: '',
decoder: new TextDecoder(),
onConnect(abort) {
const signal = this.signal;
if (!signal) {
return;
}
if (signal.aborted) {
abort(signal.reason ?? new AbortError());
return;
}
// Wrap the undici abort callback: registering it directly as an
// EventTarget listener would invoke it with the 'abort' Event object,
// which then propagates as the rejection "error".
const onAbort = () => {
abort(signal.reason ?? new AbortError());
};
this.abort = onAbort;
addAbortListener(signal, onAbort);
},
onHeaders(statusCode, headers) {
this.status = statusCode;
this.headers = headers;
},
onData(chunk) {
this.data += this.decoder.decode(chunk, { stream: true });
},
onComplete() {
if (this.signal && this.abort) {
removeAbortListener(this.signal, this.abort);
}
this.data += this.decoder.decode();
const status = this.status ?? 0;
const resHeaders = this.headers ?? {};
// Match the media type only, ignoring any parameters such as
// `charset` (e.g. `application/json; charset=utf-8`). The JSON.parse
// below is not guarded, so we must not broaden this to subtypes like
// `application/json-seq`.
const rawContentType = resHeaders['content-type'];
const contentType = (typeof rawContentType === 'string' ? rawContentType : '')
.split(';', 1)[0]
.trim()
.toLowerCase();
// Check the status *before* parsing. An error response can carry a
// body that is not valid JSON despite an `application/json`
// content-type (e.g. a truncated body or an HTML error page injected
// by a reverse proxy on a 5xx). Parsing first would throw a raw
// SyntaxError and the caller would never receive the intended HTTP
// error (with `status`/`data`) that `makeError` builds from the raw
// body.
if (status < 200 || status >= 300) {
this.reject(makeError(req, {
status,
headers: resHeaders,
data: this.data,
}));
return;
}
let data = this.data;
if (contentType === 'application/json') {
try {
data = JSON.parse(this.data);
}
catch (err) {
// Reject instead of throwing out of onComplete — nxt-undici
// treats the dispatch as settled at this point, so an exception
// here would leave the promise pending forever.
this.reject(Object.assign(new Error('invalid json'), { data: this.data, cause: err }));
return;
}
}
this.resolve({
data: data,
status,
headers: resHeaders,
});
},
onError(err) {
if (this.signal && this.abort) {
removeAbortListener(this.signal, this.abort);
}
this.reject(err);
},
};
void dispatch(client, req, handler);
});
}
async function bulkDocs(body, opts = {}) {
const { client = getClient('_bulk_docs'), signal, idempotent = true } = opts;
const req = {
pathname: '_bulk_docs',
client,
idempotent,
body,
method: 'POST',
signal,
};
const res = await request(req.pathname, req);
// 202 Accepted is a successful write on a degraded cluster (quorum not
// met, but the docs were durably committed to the reachable nodes).
if (res.status !== 201 && res.status !== 202) {
throw makeError(req, res);
}
} finally {
src?.on('error', () => {}).destroy()
}
return res.data;
}
}
const ACCEPT_HEADERS = ['Accept', 'application/json']
const ACCEPT_CONTENT_TYPE_HEADERS = [...ACCEPT_HEADERS, 'Content-Type', 'application/json']
function request(
url,
{ params, client = defaultClient, idempotent, body, method, headers, signal },
) {
if (Array.isArray(headers)) {
// Do nothing...
} else if (headers) {
const entries = Object.entries(headers)
headers = []
for (const [key, val] of entries) {
headers.push(key, val)
}
} else {
// Copy the shared default array: the user-agent append below mutates
// `headers` in place, which must not leak into the module-level constant.
headers = [...(body ? ACCEPT_CONTENT_TYPE_HEADERS : ACCEPT_HEADERS)]
async function allDocs(pathname, opts = {}) {
if (pathname && typeof pathname === 'object') {
opts = pathname;
pathname = null;
}
pathname = pathname || '_all_docs';
const { client = getClient(pathname), signal, idempotent = true, ...options } = opts;
const { params, method, headers, body } = _normalizeAllDocsOptions(options);
const req = {
pathname,
params,
client,
idempotent,
body,
method,
headers,
signal,
};
const res = await request(req.pathname, req);
if (res.status !== 200) {
throw makeError(req, res);
}
return res.data;
}
if (
userAgent &&
!headers.some((element, index) => index % 2 === 0 && /user-agent/i.test(element))
) {
headers.push('user-agent', userAgent)
async function put(pathname, params, body, { client = defaultClient, signal, idempotent = true, headers = null } = {}) {
const req = {
pathname,
params,
client,
idempotent,
body,
method: 'PUT',
headers,
signal,
};
const res = await request(req.pathname, req);
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res);
}
return res.data;
}
let path = dbPathname
if (url) {
path = urljoin(
path,
url
.split('/')
.map((part) => encodeURIComponent(part))
.join('/'),
)
async function post(pathname, params, body, opts = {}) {
const { client, signal, idempotent = true, headers } = opts;
const req = {
pathname,
params,
client,
idempotent,
body,
method: 'POST',
headers,
signal,
};
const res = await request(req.pathname, req);
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res);
}
return res.data;
}
if (params) {
path += `?${querystring.stringify(params)}`
async function get(pathname, params, body, { client = getClient('_all_docs'), signal, idempotent = true, headers = null, } = {}) {
const req = {
pathname,
params,
client,
idempotent,
body,
method: 'GET',
headers,
signal,
};
const res = await request(req.pathname, req);
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res);
}
return res.data;
}
const req = {
path,
origin: dbOrigin,
idempotent,
method,
body: typeof body === 'object' && body ? JSON.stringify(body) : body,
headers,
async function _delete(pathname, params, body, { client = defaultClient, signal, idempotent = true, headers = null } = {}) {
const req = {
pathname,
params,
client,
idempotent,
body,
method: 'DELETE',
headers,
signal,
};
const res = await request(req.pathname, req);
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res);
}
return res.data;
}
return new Promise((resolve, reject) =>
dispatch(client, req, {
resolve,
reject,
signal,
status: null,
headers: null,
abort: null,
data: '',
decoder: new TextDecoder(),
onConnect(abort) {
if (!this.signal) {
return
}
if (this.signal.aborted) {
abort()
return
}
this.abort = abort
if ('addEventListener' in this.signal) {
this.signal.addEventListener('abort', abort)
} else {
this.signal.addListener('abort', abort)
}
},
onHeaders(statusCode, headers) {
this.status = statusCode
this.headers = headers
},
onData(chunk) {
this.data += this.decoder.decode(chunk, { stream: true })
},
onComplete() {
if (this.signal) {
if ('removeEventListener' in this.signal) {
this.signal.removeEventListener('abort', this.abort)
} else {
this.signal.removeListener('abort', this.abort)
async function info(params, body, { client = defaultClient, signal, idempotent = true, headers = null } = {}) {
const req = {
pathname: null,
params,
client,
idempotent,
body,
method: 'GET',
headers,
signal,
};
const res = await request(req.pathname, req);
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res);
}
return res.data;
}
async function up({ client = defaultClient, signal, } = {}) {
const res = await undiciRequest(new URL('/_up', dbOrigin), {
signal,
dispatcher: client,
});
return await res.body.json();
}
async function upsert(pathname,
// `any` doc so the concrete function satisfies the generic
// CouchClient.upsert<Doc> signature (unknown is not assignable to Doc).
// oxlint-disable-next-line typescript/no-explicit-any
diffFun, { client = defaultClient, signal, } = {}) {
while (true) {
let doc;
try {
doc = (await get(pathname, null, null, { client, signal }));
}
}
this.data += this.decoder.decode()
// Match the media type only, ignoring any parameters such as
// `charset` (e.g. `application/json; charset=utf-8`). The JSON.parse
// below is not guarded, so we must not broaden this to subtypes like
// `application/json-seq`.
const contentType = (this.headers['content-type'] ?? '')
.split(';', 1)[0]
.trim()
.toLowerCase()
// Check the status *before* parsing. An error response can carry a
// body that is not valid JSON despite an `application/json`
// content-type (e.g. a truncated body or an HTML error page injected
// by a reverse proxy on a 5xx). Parsing first would throw a raw
// SyntaxError and the caller would never receive the intended HTTP
// error (with `status`/`data`) that `makeError` builds from the raw
// body.
if (this.status < 200 || this.status >= 300) {
this.reject(
makeError(req, {
status: this.status,
headers: this.headers,
data: this.data,
}),
)
return
}
let data = this.data
if (contentType === 'application/json') {
data = JSON.parse(this.data)
}
this.resolve({
data,
status: this.status,
headers: this.headers,
})
},
onError(err) {
if (this.signal) {
if ('removeEventListener' in this.signal) {
this.signal.removeEventListener('abort', this.abort)
} else {
this.signal.removeListener('abort', this.abort)
catch (err) {
if (err.status !== 404) {
throw err;
}
// Use the full pathname, not just the trailing segment — a design doc
// upsert('_design/foo') must create _id '_design/foo', not 'foo'.
doc = {
_id: pathname,
};
}
}
this.reject(err)
},
}),
)
}
async function bulkDocs(body, opts = {}) {
const { client = getClient('_bulk_docs'), signal, idempotent = true } = opts
const req = {
pathname: '_bulk_docs',
client,
idempotent,
body,
method: 'POST',
signal,
const docId = doc._id;
const docRev = doc._rev;
const newDoc = diffFun(doc);
if (!newDoc || (!docRev && newDoc._deleted)) {
return { updated: false, rev: docRev, id: docId, doc };
}
newDoc._id = docId;
newDoc._rev = docRev;
try {
return {
...(await put(pathname, null, newDoc, { client, signal })),
doc: newDoc,
updated: true,
};
}
catch (err) {
if (err.status !== 409) {
throw err;
}
}
}
}
const res = await request(req.pathname, req)
if (res.status !== 201) {
throw makeError(req, res)
async function close() {
await defaultClient.close();
// TODO (fix): Close other clients.
}
return res.data
}
async function allDocs(pathname, opts = {}) {
if (pathname && typeof pathname === 'object') {
opts = pathname
pathname = null
// `satisfies` keeps the implementation compile-checked against the exported
// interface (a plain cast would let the two drift apart silently).
return Object.freeze({
url: new URL(dbUrl),
request,
bulkDocs,
allDocs,
put,
post,
get,
upsert,
delete: _delete,
info,
changes,
close,
up,
});
}
function _normalizeAllDocsOptions({ conflicts, update_seq, descending, include_docs, sorted, key, startkey, start_key, startkey_docid, endkey, end_key, endkey_docid, inclusive_end, limit, skip, stale, reduce, stable, update, keys, group, group_level, ...rest }) {
if (Object.keys(rest).length > 0) {
throw new Error('invalid options: ' + JSON.stringify(rest));
}
pathname = pathname || '_all_docs'
const { client = getClient(pathname), signal, idempotent = true, ...options } = opts
const { params, method, headers, body } = _normalizeAllDocsOptions(options)
const req = {
pathname: pathname || '_all_docs',
params,
client,
idempotent,
body,
method,
headers,
signal,
const params = {};
const headers = {
Accept: 'application/json',
};
let method = 'GET';
let body;
if (conflicts) {
params.conflicts = true;
}
const res = await request(req.pathname, req)
if (res.status !== 200) {
throw makeError(req, res)
if (update_seq) {
params.update_seq = true;
}
return res.data
}
async function put(
pathname,
params,
body,
{ client = defaultClient, signal, idempotent = true, headers = null } = {},
) {
const req = {
pathname,
params,
client,
idempotent,
body,
method: 'PUT',
headers,
signal,
if (descending) {
params.descending = true;
}
const res = await request(req.pathname, req)
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res)
if (include_docs) {
params.include_docs = true;
}
return res.data
}
async function post(pathname, params, body, opts = {}) {
const { client, signal, idempotent = true, headers } = opts
const req = {
pathname,
params,
client,
idempotent,
body,
method: 'POST',
headers,
signal,
// sorted defaults to true server-side, so false is the only value that does
// anything — it must not be dropped by a truthiness check.
if (sorted != null) {
params.sorted = !!sorted;
}
const res = await request(req.pathname, req)
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res)
if (key != null) {
params.key = JSON.stringify(key);
}
return res.data
}
async function get(
pathname,
params,
body,
{ client = getClient('_all_docs'), signal, idempotent = true, headers = null } = {},
) {
const req = {
pathname,
params,
client,
idempotent,
body,
method: 'GET',
headers,
signal,
if (startkey != null || start_key != null) {
params.startkey = JSON.stringify(startkey ?? start_key);
}
const res = await request(req.pathname, req)
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res)
// startkey_docid/endkey_docid are plain document-id strings in CouchDB, NOT
// JSON values (unlike key/startkey/endkey). JSON.stringify would send a quoted
// value (e.g. `%22mydoc%22`) that never matches a real _id.
if (startkey_docid != null) {
params.startkey_docid = startkey_docid;
}
return res.data
}
async function _delete(
pathname,
params,
body,
{ client = defaultClient, signal, idempotent = true, headers = null } = {},
) {
const req = {
pathname,
params,
client,
idempotent,
body,
method: 'DELETE',
headers,
signal,
if (endkey != null || end_key != null) {
params.endkey = JSON.stringify(endkey ?? end_key);
}
const res = await request(req.pathname, req)
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res)
if (endkey_docid != null) {
params.endkey_docid = endkey_docid;
}
return res.data
}
async function info(
params,
body,
{ client = defaultClient, signal, idempotent = true, headers = null } = {},
) {
const req = {
pathname: null,
params,
client,
idempotent,
body,
method: 'GET',
headers,
signal,
if (inclusive_end != null) {
params.inclusive_end = !!inclusive_end;
}
const res = await request(req.pathname, req)
if (res.status < 200 || res.status >= 300) {
throw makeError(req, res)
if (limit != null) {
params.limit = limit;
}
return res.data
}
async function up({ client = defaultClient, signal } = {}) {
const res = await undiciRequest(new URL('/_up', dbOrigin), {
signal,
dispatcher: client,
})
return await res.body.json()
}
async function upsert(pathname, diffFun, { client = defaultClient, signal } = {}) {
while (true) {
let doc
try {
doc = await get(pathname, null, null, { client, signal })
} catch (err) {
if (err.status !== 404) {
throw err
}
doc = {
_id: pathname.split('/').pop(),
}
}
const docId = doc._id
const docRev = doc._rev
const newDoc = diffFun(doc)
if (!newDoc || (!docRev && newDoc._deleted)) {
return { updated: false, rev: docRev, id: docId, doc }
}
newDoc._id = docId
newDoc._rev = docRev
try {
return {
...(await put(pathname, null, newDoc, { client, signal })),
doc: newDoc,
updated: true,
}
} catch (err) {
if (err.status !== 409) {
throw err
}
}
if (skip != null) {
params.skip = skip;
}
}
async function close() {
await defaultClient.close()
// TODO (fix): Close other clients.
}
return Object.freeze({
url: new URL(config.url),
request,
bulkDocs,
allDocs,
put,
post,
get,
upsert,
delete: _delete,
info,
changes,
close,
up,
})
}
function _normalizeAllDocsOptions({
conflicts,
update_seq,
descending,
include_docs,
sorted,
key,
startkey,
start_key,
startkey_docid,
endkey,
end_key,
endkey_docid,
inclusive_end,
limit,
skip,
stale,
reduce,
stable,
update,
keys,
group,
group_level,
...rest
}) {
if (Object.keys(rest).length > 0) {
throw new Error('invalid options: ' + JSON.stringify(rest))
}
const params = {}
const headers = {
Accept: 'application/json',
}
let method = 'GET'
let body
if (conflicts) {
params.conflicts = true
}
if (update_seq) {
params.update_seq = true
}
if (descending) {
params.descending = true
}
if (include_docs) {
params.include_docs = true
}
if (sorted) {
params.sorted = true
}
if (key != null) {
params.key = JSON.stringify(key)
}
if (startkey != null || start_key != null) {
params.startkey = JSON.stringify(startkey ?? start_key)
}
// startkey_docid/endkey_docid are plain document-id strings in CouchDB, NOT
// JSON values (unlike key/startkey/endkey). JSON.stringify would send a quoted
// value (e.g. `%22mydoc%22`) that never matches a real _id.
if (startkey_docid != null) {
params.startkey_docid = startkey_docid
}
if (endkey != null || end_key != null) {
params.endkey = JSON.stringify(endkey ?? end_key)
}
if (endkey_docid != null) {
params.endkey_docid = endkey_docid
}
if (inclusive_end != null) {
params.inclusive_end = !!inclusive_end
}
if (limit != null) {
params.limit = limit
}
if (skip != null) {
params.skip = skip
}
if (stale != null) {
params.stale = stale
}
if (reduce != null) {
params.reduce = reduce
}
if (group != null) {
params.group = group
}
if (group_level != null) {
params.group_level = group_level
}
if (update != null) {
params.update = update
}
if (stable != null) {
params.stable = stable
}
if (keys != null) {
method = 'POST'
body = JSON.stringify({ keys })
headers['Content-Type'] = 'application/json'
}
return {
method,
params,
headers,
body,
}
}
class StreamOutput extends stream.Readable {
#str
#resume
#abort
#state
#decoder
#headers
constructor({ signal, highWaterMark = 256 }) {
super({ objectMode: true, highWaterMark, signal })
}
get headers() {
return this.#headers
}
_read() {
this.#resume?.()
}
_destroy(err, callback) {
this.#abort?.(err)
callback(err)
}
onConnect(abort) {
if (this.destroyed) {
abort(this.errored)
} else if (this.#state) {
throw new Error('unusable')
} else {
this.#state = 0
this.#str = ''
this.#abort = abort
this.#decoder = new TextDecoder()
if (stale != null) {
params.stale = stale;
}
}
onHeaders(statusCode, headers, resume) {
if (statusCode >= 300 || statusCode < 200) {
throw new Error('invalid status code: ' + statusCode)
if (reduce != null) {
params.reduce = reduce;
}
this.#headers = headers
this.#resume = resume
}
onData(data) {
const lines = this.#decoder.decode(data, { stream: true }).split(/\r?\n+/)
lines[0] = this.#str + lines[0]
this.#str = lines.pop() ?? ''
try {
let ret = true
for (const line of lines) {
if (!line) {
continue
}
if (this.#state === 0) {
if (/\[\s*$/.test(line)) {
this.#state = 1
} else {
throw new Error('expected [ at end of line')
}
} else if (this.#state === 1) {
if (/^\s*\]/.test(line)) {
this.#state = 2
} else {
const row = JSON.parse(line.slice(0, line.lastIndexOf('}') + 1))
if (!this.push(row)) {
ret = false
}
}
}
}
return ret
} catch (err) {
throw Object.assign(new Error('invalid data'), {
data: lines.join('\n') + this.#str,
cause: err,
})
if (group != null) {
params.group = group;
}
}
onComplete() {
assert(this.#state === 2)
this.push(null)
}
onError(err) {
this.destroy(err)
}
}
class PromiseOutput {
#resolve
#reject
#str
#decoder
#signal
#abort
constructor({ resolve, reject, signal }) {
this.#resolve = resolve
this.#reject = reject
this.#signal = signal
}
onConnect(abort) {
this.#decoder = new TextDecoder()
this.#str = ''
if (this.#signal?.aborted) {
abort()
} else {
this.#abort = abort
this.#signal?.addEventListener('abort', this.#abort)
if (group_level != null) {
params.group_level = group_level;
}
}
onHeaders(statusCode, rawHeaders, resume, statusText) {
if (statusCode >= 300 || statusCode < 200) {
throw new Error('invalid status code: ' + statusCode)
if (update != null) {
params.update = update;
}
}
onData(data) {
this.#str += this.#decoder.decode(data, { stream: true })
}
onComplete() {
this.#str += this.#decoder.decode(undefined, { stream: false })
try {
this.#onDone(null, JSON.parse(this.#str))
} catch (err) {
this.#onDone(Object.assign(new Error('invalid json'), { data: this.#str, cause: err }))
if (stable != null) {
params.stable = stable;
}
}
onError(err) {
this.#onDone(err)
}
#onDone(err, val) {
if (err) {
this.#reject(err)
} else {
this.#resolve(val)
if (keys != null) {
method = 'POST';
body = JSON.stringify({ keys });
headers['Content-Type'] = 'application/json';
}
if (this.#abort) {
this.#signal?.removeEventListener('abort', this.#abort)
}
}
return {
method,
params,
headers,
body,
};
}
const defaultDispatcher = new Agent({
// pipelining: 4,
connections: 8 * 4,
connectTimeout: 2e3,
})
const blockingDispatcher = new Agent({
pipelining: 1,
connections: 1024,
connectTimeout: 2e3,
})
export function request(url, opts) {
if (typeof url === 'string') {
opts = { url: new URL(url), ...opts }
} else if (url instanceof URL) {
opts = { url, ...opts }
} else if (typeof url.origin === 'string' && typeof (url.path ?? url.pathname) === 'string') {
opts = opts ? { ...url, ...opts } : url
}
if (opts == null && typeof url === 'object' && url != null) {
opts = url
}
url = opts.url
if (typeof url === 'string') {
url = new URL(url)
}
let origin = url.origin
if (!origin) {
const protocol = url.protocol ?? 'http:'
const host = url.host ?? `${url.hostname}:${url.port ?? (protocol === 'https:' ? 443 : 80)}`
origin = `${protocol}//${host}`
}
let path = url.path
if (!path) {
path = url.search ? `${url.pathname}${url.search}` : url.pathname
}
const ureq = {
...opts,
dns:
opts.dns !== false && opts.dns !== null
? {
balance: 'hash',
...opts.dns,
}
: opts.dns,
origin,
path,
method: opts.method ?? (opts.body ? 'POST' : 'GET'),
blocking: opts.blocking ?? Boolean(opts.stream),
headers: {
'content-type':
opts.body != null && typeof opts.body === 'object' ? 'application/json' : 'text/plain',
accept: 'application/json',
...opts.headers,
},
cache: false,
body:
opts.body != null && typeof opts.body === 'object' ? JSON.stringify(opts.body) : opts.body,
}
const dispatcher = opts.dispatcher ?? (ureq.blocking ? blockingDispatcher : defaultDispatcher)
const signal = opts.signal
if (opts.stream) {
const handler = new StreamOutput({ signal, highWaterMark: stream.highWaterMark })
dispatch(dispatcher, ureq, handler)
return handler
} else {
return new Promise((resolve, reject) => {
const handler = new PromiseOutput({ resolve, reject, signal })
dispatch(dispatcher, ureq, handler)
})
}
}
globalThis.__nxt_lib_couch = {
request,
defaultDispatcher,
}
//# sourceMappingURL=index.js.map
{
"name": "@nxtedition/couch",
"version": "1.1.51",
"version": "2.0.0",
"type": "module",

@@ -8,3 +8,7 @@ "main": "lib/index.js",

"exports": {
".": "./lib/index.js"
".": {
"types": "./lib/index.d.ts",
"source": "./src/index.ts",
"default": "./lib/index.js"
}
},

@@ -16,9 +20,10 @@ "files": [

"scripts": {
"build": "rimraf lib && mkdir -p lib && cp src/index.js lib/index.js && cp src/index.d.ts lib/index.d.ts",
"build": "rimraf lib && tsc -p tsconfig.build.json",
"typecheck": "tsc --noEmit",
"test": "node --test",
"test:ci": "node --test"
"test": "node --conditions=source --test",
"test:types": "tsd",
"test:ci": "node --conditions=source --test && tsd"
},
"dependencies": {
"@nxtedition/error": "^1.1.39",
"@nxtedition/error": "^1.1.40",
"@nxtedition/nxt-undici": "^7.3.27",

@@ -30,9 +35,9 @@ "@nxtedition/weak-cache": "^1.0.12",

"devDependencies": {
"@nxtedition/logger": "^2.1.34",
"@nxtedition/scheduler": "^4.1.18",
"@types/http-errors": "^2.0.5",
"@types/node": "^25.9.4",
"rimraf": "^6.1.3",
"typescript": "^5.9.3",
"undici": "^7.28.0"
"tsd": "^0.33.0",
"typescript": "^5.9.3"
},
"gitHead": "44032308de159c06fc694c901a12c35a8bd628ea"
"gitHead": "67d19205b4876ee6dc1c6c75742dbd64361cf70d"
}