@filelayer/core 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +338 -0
- package/LICENSE +202 -0
- package/MIGRATIONS.md +328 -0
- package/NOTICE +37 -0
- package/README.md +343 -0
- package/SEMANTICS.md +729 -0
- package/dist/authz.d.ts +524 -0
- package/dist/authz.d.ts.map +1 -0
- package/dist/authz.js +889 -0
- package/dist/authz.js.map +1 -0
- package/dist/db.d.ts +145 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +217 -0
- package/dist/db.js.map +1 -0
- package/dist/delivery.d.ts +293 -0
- package/dist/delivery.d.ts.map +1 -0
- package/dist/delivery.js +519 -0
- package/dist/delivery.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -0
- package/dist/filelayer.d.ts +542 -0
- package/dist/filelayer.d.ts.map +1 -0
- package/dist/filelayer.js +1360 -0
- package/dist/filelayer.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/simple.d.ts +297 -0
- package/dist/simple.d.ts.map +1 -0
- package/dist/simple.js +492 -0
- package/dist/simple.js.map +1 -0
- package/dist/storage.d.ts +269 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +700 -0
- package/dist/storage.js.map +1 -0
- package/dist/store.d.ts +432 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +862 -0
- package/dist/store.js.map +1 -0
- package/package.json +77 -0
- package/schema.sql +1190 -0
- package/src/authz.ts +1398 -0
- package/src/db.ts +271 -0
- package/src/delivery.ts +737 -0
- package/src/errors.ts +24 -0
- package/src/filelayer.ts +1836 -0
- package/src/index.ts +7 -0
- package/src/simple.ts +666 -0
- package/src/storage.ts +917 -0
- package/src/store.ts +1072 -0
- package/test/delivery.test.ts +0 -0
- package/test/group-subjects.test.ts +1072 -0
- package/test/helpers.ts +65 -0
- package/test/listing.test.ts +689 -0
- package/test/local-s3.d.mts +33 -0
- package/test/local-s3.mjs +400 -0
- package/test/persistence.test.ts +953 -0
- package/test/regression.test.ts +619 -0
- package/test/s3-live.test.ts +322 -0
- package/test/security.test.ts +1652 -0
- package/test/semantics.test.ts +888 -0
- package/test/storage.test.ts +437 -0
- package/test/tiers.test.ts +432 -0
- package/test/vault-example.test.ts +302 -0
- package/tsconfig.build.json +29 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoFrD,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CACxB,CAAiB;IAEjB,OAAO,OAAO,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,CAAiB;IAEjB,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AACtC,CAAC;AAED,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,yDAAyD;AACzD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAkC,EAClC,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI;IAEzB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;YAC1B,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;gBAClB,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,yCAAyC,CAAC,CAAC;YACxF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACf,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,OAAO,IAAI,cAAc,CAAa;QACpC,KAAK,CAAC,UAAU;YACd,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,uCAAuC;AACvC,gFAAgF;AAEhF,MAAM,OAAO,aAAa;IACf,QAAQ,GAAG,QAAQ,CAAC;IAEZ,OAAO,GAAG,IAAI,GAAG,EAG/B,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAa,EAAE,WAAmB;QACvD,MAAM,KAAK,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACpF,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;YACvB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,YAAY,EAAE,CAAC,CAAC,YAAY;SAC7B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAA8B,EAAE;QACxD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,KAAK,GAAG,GAAG;gBAAE,OAAO,IAAI,CAAC;YAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YAC9C,OAAO;gBACL,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC;gBAC1B,IAAI,EAAE,KAAK,CAAC,UAAU;gBACtB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;aAC7B,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChG,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAc,EACd,OAAmD,EAAE;QAErD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aACpC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;aAClD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,GAAG,EAAE,CAAC;gBACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;gBACvB,YAAY,EAAE,CAAC,CAAC,YAAY;aAC7B,CAAC,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SACzE,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IAEH,0EAA0E;IAC1E,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;CACF;AA4CD,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AACtC,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,MAAM,OAAO,SAAS;IACX,QAAQ,CAAS;IAET,GAAG,CAEU;IAE9B,YAAY,GAAa;QACvB,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,CAAU,EAAE,CAAC;YAC5F,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,GAAG,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ;YACX,GAAG,CAAC,QAAQ,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,GAAG,GAAG;YACT,QAAQ;YACR,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;YAChC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,iBAAiB,CAAC;YAC9E,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACtF,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,GAAG,CACP,GAAW,EACX,IAAa,EACb,WAAmB,EACnB,OAA0B,EAAE;QAE5B,IAAI,IAAI,YAAY,UAAU;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,SAAS,CACrB,GAAW,EACX,IAAgB,EAChB,WAAmB;QAEnB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC;YACjC,MAAM,EAAE,KAAK;YACb,GAAG;YACH,IAAI;YACJ,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE;SACzC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,+CAA+C;QACxE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IACnE,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,SAAS,CACrB,GAAW,EACX,IAAgC,EAChC,WAAmB,EACnB,IAAuB;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAElD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,iCAAiC;YACjC,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,IAAI,QAAQ,EAAE,CAAC;YACvE,gEAAgE;QAClE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACpE,MAAM,KAAK,GAAgD,EAAE,CAAC;QAC9D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,OAAO,GAAe,KAAK,CAAC,KAAK,CAAC;QAEtC,IAAI,CAAC;YACH,SAAS,CAAC;gBACR,UAAU,IAAI,CAAC,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC5F,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;gBAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACjD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI;oBAAE,MAAM;gBACpD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;gBACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,UAAU,IAAI,CAAC,CAAC;oBAChB,KAAK,CAAC,IAAI,CAAC;wBACT,UAAU;wBACV,IAAI,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC;qBAChE,CAAC,CAAC;oBACH,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;oBAC5B,MAAM;gBACR,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACtE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,uEAAuE;YACvE,wEAAwE;YACxE,qEAAqE;YACrE,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC/D,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,GAAW,EAAE,WAAmB;QAClE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC;YACjC,MAAM,EAAE,MAAM;YACd,GAAG;YACH,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACtB,IAAI,EAAE,IAAI,UAAU,EAAE;YACtB,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE;SACzC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACzF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,GAAW,EACX,QAAgB,EAChB,UAAkB,EAClB,IAAgB;QAEhB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC;YACjC,MAAM,EAAE,KAAK;YACb,GAAG;YACH,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE;YACnD,IAAI;SACL,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,GAAW,EACX,QAAgB,EAChB,KAAkD;QAElD,MAAM,GAAG,GACP,2BAA2B;YAC3B,KAAK;iBACF,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,qBAAqB,CAAC,CAAC,UAAU,sBAAsB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAC3F;iBACA,IAAI,CAAC,EAAE,CAAC;YACX,4BAA4B,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC;YACjC,MAAM,EAAE,MAAM;YACd,GAAG;YACH,KAAK,EAAE,EAAE,QAAQ,EAAE;YACnB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;YACnC,OAAO,EAAE,EAAE,cAAc,EAAE,iBAAiB,EAAE;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,6EAA6E;QAC7E,uEAAuE;QACvE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,iEAAiE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC9G,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,GAAW,EAAE,QAAgB;QAC9D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnF,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,sEAAsE;QACtE,oDAAoD;QACpD,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACpC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YAC5C,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;SACvC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAA8B,EAAE;QACxD,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,OAAO,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS;oBAC1B,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG;oBAC9B,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,6EAA6E;QAC7E,wDAAwD;QACxD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAEvE,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAiB;YACxB,IAAI,EAAE,GAAG,CAAC,IAAkC;YAC5C,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACvC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YAC5C,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;SAC9B,CAAC;QACF,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,EAAE,IAAI,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC;YAAE,GAAG,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxC,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAc,EACd,OAAmD,EAAE;QAErD,MAAM,KAAK,GAA2B;YACpC,WAAW,EAAE,GAAG;YAChB,MAAM;YACN,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;SACpE,CAAC;QACF,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,IAAI,EAAE,EAAE,CAAC;YACnE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7B,IAAI,GAAG,KAAK,IAAI;gBAAE,SAAS;YAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC;gBACrB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;aACvC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,MAAM,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtF,CAAC;IAED,6EAA6E;IAE7E;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,IAAoB;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrG,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,kBAAkB,CAAC;QAChE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAElD,MAAM,KAAK,GAA2B;YACpC,iBAAiB,EAAE,kBAAkB;YACrC,kBAAkB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,KAAK,EAAE;YACtD,YAAY,EAAE,OAAO;YACrB,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC;YAChC,qBAAqB,EAAE,MAAM;SAC9B,CAAC;QACF,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY;YAAE,KAAK,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;QACjF,IAAI,IAAI,CAAC,mBAAmB;YAAE,KAAK,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACxF,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACpC,KAAK,CAAC,8BAA8B,CAAC,GAAG,IAAI,CAAC,0BAA0B,CAAC;QAC1E,CAAC;QAED,MAAM,gBAAgB,GAAG;YACvB,KAAK;YACL,YAAY;YACZ,oBAAoB,CAAC,KAAK,CAAC;YAC3B,QAAQ,GAAG,CAAC,IAAI,IAAI;YACpB,MAAM;YACN,kBAAkB;SACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACzE,KAAK,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;QACrC,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,YAAY,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,6EAA6E;IAE7E;;;;;;;;;OASG;IACK,SAAS,CAAC,GAAW;QAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,IAAI,IAAY,CAAC;QACjB,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,GAAG,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IAEO,IAAI,CAAC,SAAiB,EAAE,QAAgB,EAAE,KAAa,EAAE,gBAAwB;QACvF,MAAM,YAAY,GAAG;YACnB,kBAAkB;YAClB,QAAQ;YACR,KAAK;YACL,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;SACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,IAAI,CAAC,GAAW,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,MAAM,CAAC,CAAC;QACvE,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;YACtE,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,GAMzB;QACC,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC;QAE5D,MAAM,OAAO,GAA2B;YACtC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,sBAAsB,EAAE,WAAW;YACnC,YAAY,EAAE,OAAO;SACtB,CAAC;QACF,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY;YAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;QACnF,6EAA6E;QAC7E,4EAA4E;QAC5E,4DAA4D;QAC5D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;QAErF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,4EAA4E;QAC5E,4EAA4E;QAC5E,sDAAsD;QACtD,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAElG,MAAM,gBAAgB,GAAG;YACvB,GAAG,CAAC,MAAM;YACV,YAAY;YACZ,GAAG;YACH,gBAAgB;YAChB,aAAa;YACb,WAAW;SACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,kBAAkB,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAEzE,OAAO,CAAC,eAAe,CAAC;YACtB,+BAA+B,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,KAAK,IAAI;gBAChE,iBAAiB,aAAa,eAAe,SAAS,EAAE,CAAC;QAE3D,MAAM,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,YAAY,IAAI,GAAG,EAAE,CAAC;QACnG,4EAA4E;QAC5E,0EAA0E;QAC1E,2EAA2E;QAC3E,uEAAuE;QACvE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QACzC,OAAO,KAAK,CAAC,MAAM,EAAE;YACnB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,IAAI;YACb,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;gBACzE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAA2B,EAAE;gBAC3C,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;IACL,CAAC;CACF;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,SAAS,SAAS,CAAC,IAAgB;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,SAAS,CAAC,CAAO;IACxB,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAClC,UAAU,EACV,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CACxD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,KAA6B;IAChE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAU,CAAC;SAClD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7F,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;;;;GAMG;AACH,KAAK,UAAU,WAAW,CACxB,MAA+C,EAC/C,CAAS;IAET,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC;YAAE,SAAS;QAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,MAAM,CAAC,MAAoB,EAAE,KAAa;IACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,UAAU,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC,CAAC,CAAE,CAAC;IAC9E,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACf,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,MAAM,CAAC,GAAW,EAAE,GAAW;IACtC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,kBAAkB,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAChG,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC;SACL,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,OAAO,CAAC,EAAU,EAAE,GAAa;IAC9C,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,KAAK,CACnB,WAAW,EAAE,YAAY,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACjG,CAAC;IACD,GAA2D,CAAC,MAAM,GAAG,IAAI,CAAC;IAC1E,GAA2D,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IACjF,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STORE LAYER
|
|
3
|
+
*
|
|
4
|
+
* Implements `AuthzDeps` (see authz.ts) against PostgreSQL.
|
|
5
|
+
*
|
|
6
|
+
* The authorization grant lookups below MUST read through the `live_grant`
|
|
7
|
+
* view, never `file_grant`. The liveness predicate -- not revoked, not expired,
|
|
8
|
+
* under cap, AND the same for every ancestor of the grant -- is expressed
|
|
9
|
+
* exactly once, in the schema, and every caller inherits it. If a future query
|
|
10
|
+
* here reaches for `file_grant` directly it has silently opted out of
|
|
11
|
+
* revocation, expiry and delegation control, which is P4, which is the product.
|
|
12
|
+
* The view is the enforcement point, not a convenience.
|
|
13
|
+
*
|
|
14
|
+
* The one deliberate exception is `findGrantBySecret`, which reads
|
|
15
|
+
* `file_grant`. It exists so that a denial can be ATTRIBUTED and EXPLAINED in
|
|
16
|
+
* the audit log, and the engine never uses its result to allow anything. It is
|
|
17
|
+
* named to make that obvious and it is the only such query in the file.
|
|
18
|
+
*
|
|
19
|
+
* ------------------------------------------------------------------------
|
|
20
|
+
* TRUST BOUNDARY. EVERY METHOD ON `PostgresStore` IS UNAUTHORIZED.
|
|
21
|
+
* ------------------------------------------------------------------------
|
|
22
|
+
* This class is the engine's DEPENDENCY surface (`AuthzDeps`), not an API.
|
|
23
|
+
* `getFile`, `getActorGrants`, `listAuthorizedFiles`, `listAudit`,
|
|
24
|
+
* `verifyAuditChain` and `consumeDownload` all take resource ids and no
|
|
25
|
+
* principal, because the engine has already established standing before it
|
|
26
|
+
* calls them -- that is the division of labour. They are the same shape as the
|
|
27
|
+
* defect fixed in `Filelayer.getFileRecord`, and they are safe only because
|
|
28
|
+
* they are not reachable from the developer's surface.
|
|
29
|
+
*
|
|
30
|
+
* The rule that keeps that true, stated so it can be enforced in review:
|
|
31
|
+
* `@filelayer/sdk` -- the only thing a customer touches in a hosted deployment
|
|
32
|
+
* -- MUST NOT re-export `PostgresStore`, `Filelayer.store`, or `store.db`. A
|
|
33
|
+
* developer holding `store.db` holds arbitrary SQL over every tenant in the
|
|
34
|
+
* hosted database, which is precisely the connection a hosted deployment exists
|
|
35
|
+
* to take away from them.
|
|
36
|
+
*/
|
|
37
|
+
import type { AuditInput, AuthzDeps, Capability, FileRef, GrantRow, ListedFile, ListQuery, OrgRole } from './authz.ts';
|
|
38
|
+
import type { Queryable } from './db.ts';
|
|
39
|
+
import { type MembershipCell } from './authz.ts';
|
|
40
|
+
export interface FileRow extends FileRef {
|
|
41
|
+
name: string;
|
|
42
|
+
contentType: string;
|
|
43
|
+
sizeBytes: number | null;
|
|
44
|
+
storageProvider: string;
|
|
45
|
+
storageKey: string;
|
|
46
|
+
createdAt: Date;
|
|
47
|
+
}
|
|
48
|
+
export interface AuditRow {
|
|
49
|
+
id: number;
|
|
50
|
+
orgId: string | null;
|
|
51
|
+
occurredAt: Date;
|
|
52
|
+
action: string;
|
|
53
|
+
decision: 'allow' | 'deny';
|
|
54
|
+
reason: string | null;
|
|
55
|
+
actorId: string | null;
|
|
56
|
+
fileId: string | null;
|
|
57
|
+
grantId: string | null;
|
|
58
|
+
ip: string | null;
|
|
59
|
+
userAgent: string | null;
|
|
60
|
+
context: Record<string, unknown>;
|
|
61
|
+
prevHash: string | null;
|
|
62
|
+
hash: string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* PGlite returns text[] as a JS array already; node-postgres does too. This
|
|
66
|
+
* guard exists because a raw text round-trip ('{read,write}') would otherwise
|
|
67
|
+
* silently produce a single-element array containing the literal braces, and a
|
|
68
|
+
* capability check against that string would deny everything -- fail closed,
|
|
69
|
+
* but confusingly.
|
|
70
|
+
*/
|
|
71
|
+
export declare function toCapabilities(v: Capability[] | string): Capability[];
|
|
72
|
+
/**
|
|
73
|
+
* The project every row belongs to when nobody named one. Mirrors the row
|
|
74
|
+
* inserted by schema.sql; see the PROJECT section there for why it exists.
|
|
75
|
+
*/
|
|
76
|
+
export declare const DEFAULT_PROJECT_ID = "00000000-0000-0000-0000-0000000f11e1";
|
|
77
|
+
export interface StoreOptions {
|
|
78
|
+
/**
|
|
79
|
+
* The customer application this store speaks for (P8).
|
|
80
|
+
*
|
|
81
|
+
* In a hosted deployment the API layer resolves a project from the request's
|
|
82
|
+
* API key and constructs a store bound to it. A bound store CANNOT see a
|
|
83
|
+
* file, an org or a listing belonging to any other project: the scope is
|
|
84
|
+
* applied in the SQL, not checked afterwards, so there is no branch to forget.
|
|
85
|
+
*
|
|
86
|
+
* This is defence in depth, not the primary control -- the primary control is
|
|
87
|
+
* the composite foreign keys in schema.sql, which make a cross-project
|
|
88
|
+
* reference unrepresentable. It is here because it also bounds audit-chain
|
|
89
|
+
* flooding: a caller who guesses an org UUID belonging to a DIFFERENT project
|
|
90
|
+
* cannot reach that org's audit chain at all, because `orgExists` returns
|
|
91
|
+
* false and the denial goes to the system chain.
|
|
92
|
+
*
|
|
93
|
+
* `null` means unscoped, which is correct for a single-project deployment and
|
|
94
|
+
* for the control plane. It is not the default.
|
|
95
|
+
*/
|
|
96
|
+
projectId?: string | null;
|
|
97
|
+
}
|
|
98
|
+
export declare class PostgresStore implements AuthzDeps {
|
|
99
|
+
readonly db: Queryable;
|
|
100
|
+
/** Null means unscoped. See StoreOptions. */
|
|
101
|
+
readonly projectId: string | null;
|
|
102
|
+
constructor(db: Queryable, opts?: StoreOptions);
|
|
103
|
+
/**
|
|
104
|
+
* The same store, bound to a different connection -- in practice, to an open
|
|
105
|
+
* transaction.
|
|
106
|
+
*
|
|
107
|
+
* This is what puts the audit write in the same transaction as the mutation
|
|
108
|
+
* it records. The engine calls `deps.audit()`; if `deps` is a store bound to
|
|
109
|
+
* the transaction, the event and the mutation commit or roll back together,
|
|
110
|
+
* and `audit_append()`'s advisory lock is held across BOTH rather than across
|
|
111
|
+
* one autocommit statement. `projectId` rides along, so a transactional store
|
|
112
|
+
* cannot accidentally become an unscoped one.
|
|
113
|
+
*/
|
|
114
|
+
withDb(db: Queryable): PostgresStore;
|
|
115
|
+
now(): Date;
|
|
116
|
+
getFile(fileId: string): Promise<FileRef | null>;
|
|
117
|
+
/**
|
|
118
|
+
* "Is there an org here that this store may speak about?"
|
|
119
|
+
*
|
|
120
|
+
* A soft-deleted org is not one, and neither is an org whose PROJECT is
|
|
121
|
+
* soft-deleted -- deleting a customer must not leave their tenants
|
|
122
|
+
* addressable. Nor is an org in a different project.
|
|
123
|
+
*
|
|
124
|
+
* The return value decides which audit chain a denial is written to, so this
|
|
125
|
+
* predicate is also the thing that keeps a probe at another project's org id
|
|
126
|
+
* off that org's chain.
|
|
127
|
+
*/
|
|
128
|
+
orgExists(orgId: string): Promise<boolean>;
|
|
129
|
+
/**
|
|
130
|
+
* Membership confers nothing when the org, the project, or the ACTOR
|
|
131
|
+
* has been soft-deleted (P7).
|
|
132
|
+
*
|
|
133
|
+
* The actor clause is the one that was missing. `deleted_at` existed on
|
|
134
|
+
* `actor` and nothing read it, so a "deleted" user kept every role-derived
|
|
135
|
+
* capability they had -- which made the column decorative and made the answer
|
|
136
|
+
* to "what does deleting a user do?" depend on which method you asked.
|
|
137
|
+
*/
|
|
138
|
+
getMembership(orgId: string, actorId: string): Promise<OrgRole | null>;
|
|
139
|
+
countOwners(orgId: string): Promise<number>;
|
|
140
|
+
/**
|
|
141
|
+
* live_grant only.
|
|
142
|
+
*
|
|
143
|
+
* THE ORDER BY IS LOAD-BEARING, and its absence was a latent defect found
|
|
144
|
+
* while adding the group subject types. `resolveStanding` attributes an allow
|
|
145
|
+
* to the FIRST grant in this result that supplies the requested capability,
|
|
146
|
+
* and on the delegation path that grant becomes the new grant's
|
|
147
|
+
* `parent_grant_id` -- so it decides the ceiling the attenuation trigger will
|
|
148
|
+
* measure the child against. With no ORDER BY, Postgres returned heap order,
|
|
149
|
+
* which is not a defined order at all: it changes with page layout, with
|
|
150
|
+
* VACUUM, and (this is how it surfaced) with the width of the row. A
|
|
151
|
+
* principal holding several grants on one file could therefore have a
|
|
152
|
+
* `share()` call succeed or fail depending on physical storage.
|
|
153
|
+
*
|
|
154
|
+
* Oldest-first makes the choice deterministic and makes it the sensible one:
|
|
155
|
+
* the authority you were given first is the one you delegate from, and it is
|
|
156
|
+
* the same rule `getAnonymousGrant` already applies. See the note on the
|
|
157
|
+
* residual union-vs-parent gap in `authorizeShare`.
|
|
158
|
+
*/
|
|
159
|
+
getActorGrants(fileId: string, actorId: string): Promise<GrantRow[]>;
|
|
160
|
+
/**
|
|
161
|
+
* live_grant only. THE GROUP-GRANT PATH (RFC-001).
|
|
162
|
+
*
|
|
163
|
+
* ONE JOIN. Not a fan-out table, not a cached member list, not a
|
|
164
|
+
* materialized view -- a join against `membership`, evaluated on this
|
|
165
|
+
* request. That is the whole implementation of "membership changes must
|
|
166
|
+
* change access on the next request, without recomputation": there is
|
|
167
|
+
* nothing to recompute, because nothing was ever computed. Adding a member
|
|
168
|
+
* makes the join match; removing one makes it stop matching; no `file_grant`
|
|
169
|
+
* row is read, written, or even looked at during either operation. The test
|
|
170
|
+
* that asserts this counts grant rows before and after a join and a leave.
|
|
171
|
+
*
|
|
172
|
+
* The membership half carries the same three liveness clauses `getMembership`
|
|
173
|
+
* applies -- org, project and actor not soft-deleted -- because a group grant
|
|
174
|
+
* must not confer through a membership that confers nothing on its own. The
|
|
175
|
+
* SUBJECT ORG's own deletion is handled one level down, inside
|
|
176
|
+
* `grant_scope_is_live` (I2), so it binds `consume_download` and the
|
|
177
|
+
* attenuation trigger as well and not merely this query.
|
|
178
|
+
*
|
|
179
|
+
* `subject_min_role` is compared against the held role by tuple membership
|
|
180
|
+
* in the DERIVED cell list -- see `membershipCellSql` -- so the threshold is
|
|
181
|
+
* not restated in SQL here or in `listAuthorizedFiles`.
|
|
182
|
+
*/
|
|
183
|
+
getGroupGrants(fileId: string, actorId: string): Promise<GrantRow[]>;
|
|
184
|
+
/** live_grant only. Lookup is by hash; the plaintext never reaches the DB. */
|
|
185
|
+
findLiveGrantBySecret(secretHash: string): Promise<GrantRow | null>;
|
|
186
|
+
/**
|
|
187
|
+
* ATTRIBUTION ONLY -- never an authorization input.
|
|
188
|
+
*
|
|
189
|
+
* Reads `file_grant`, so it sees revoked, expired, exhausted and
|
|
190
|
+
* ancestor-dead grants. The engine calls it exclusively on paths that have
|
|
191
|
+
* already denied, in order to name the grant in the audit event and record
|
|
192
|
+
* WHY the link stopped working. Any future use of this result to grant
|
|
193
|
+
* access is a P4 violation and should fail review.
|
|
194
|
+
*/
|
|
195
|
+
findGrantBySecret(secretHash: string): Promise<GrantRow | null>;
|
|
196
|
+
isDescendantOf(ancestorId: string, grantId: string): Promise<boolean>;
|
|
197
|
+
/** live_grant only. */
|
|
198
|
+
getAnonymousGrant(fileId: string): Promise<GrantRow | null>;
|
|
199
|
+
/**
|
|
200
|
+
* THE SET FORM OF THE DECISION.
|
|
201
|
+
*
|
|
202
|
+
* One query, one round trip, for the same predicate `authorize()` evaluates
|
|
203
|
+
* per file. Read it against `resolveStanding()` in authz.ts -- the three OR
|
|
204
|
+
* branches are the three sources of authority, in the same order, with the
|
|
205
|
+
* same conditions:
|
|
206
|
+
*
|
|
207
|
+
* 1. org role -> membership x the DERIVED role-cell list
|
|
208
|
+
* 2. actor grant -> live_grant, subject_type='actor', subject_id=caller
|
|
209
|
+
* 3. anonymous -> the EARLIEST live anonymous grant, read only
|
|
210
|
+
*
|
|
211
|
+
* ...and the lifecycle gate is the DERIVED lifecycle-cell list.
|
|
212
|
+
*
|
|
213
|
+
* The role and lifecycle tuples are not written here. They are generated by
|
|
214
|
+
* `listPredicate()` from `fileCapabilities()` and `lifecycleDenial()`, so
|
|
215
|
+
* changing the role model changes this query automatically. The tuples are
|
|
216
|
+
* still validated against the enum vocabulary before interpolation, because a
|
|
217
|
+
* generated string that reaches SQL unchecked is a generated string that can
|
|
218
|
+
* be made to reach SQL unchecked.
|
|
219
|
+
*
|
|
220
|
+
* `now` is passed in rather than read from the database so that the point
|
|
221
|
+
* check and the set query cannot disagree about what time it is. Grant
|
|
222
|
+
* liveness still uses the database clock, via `live_grant`, in BOTH paths.
|
|
223
|
+
*
|
|
224
|
+
* Ordering is (created_at, id) ascending -- total, because id is unique --
|
|
225
|
+
* and pagination is keyset, not OFFSET, so a concurrent insert cannot make a
|
|
226
|
+
* row skip a page.
|
|
227
|
+
*/
|
|
228
|
+
listAuthorizedFiles(q: ListQuery): Promise<ListedFile[]>;
|
|
229
|
+
/**
|
|
230
|
+
* Link secrets are 256 bits of CSPRNG output, so they are not guessable and
|
|
231
|
+
* not enumerable; an unsalted SHA-256 is the correct primitive here (it must
|
|
232
|
+
* be deterministic to be indexable, and there is no low-entropy input to
|
|
233
|
+
* protect). Passwords are the opposite case and use scrypt below.
|
|
234
|
+
*/
|
|
235
|
+
hashSecret(secret: string): Promise<string>;
|
|
236
|
+
hashPassword(password: string): Promise<string>;
|
|
237
|
+
verifyPassword(password: string, hash: string): Promise<boolean>;
|
|
238
|
+
/**
|
|
239
|
+
* Hash chain. Each event commits to its predecessor in the same chain, where
|
|
240
|
+
* a chain is an org -- or the SYSTEM chain, `org_id IS NULL`, for decisions
|
|
241
|
+
* with no tenant to attribute them to.
|
|
242
|
+
*
|
|
243
|
+
* The digest now covers EVERY forensically relevant column, not the
|
|
244
|
+
* seven it used to cover. `reason`, `grant_id`, `ip`, `user_agent` and
|
|
245
|
+
* `context` are exactly the fields an incident responder relies on and
|
|
246
|
+
* exactly the fields an attacker would rewrite; leaving them outside the
|
|
247
|
+
* commitment made the chain decorative for the questions that matter.
|
|
248
|
+
*
|
|
249
|
+
* JSON encoding rather than string concatenation because concatenation is
|
|
250
|
+
* ambiguous: ('ab','c') and ('a','bc') would hash identically and a forger
|
|
251
|
+
* could shift field boundaries. `context` is canonicalised with sorted keys
|
|
252
|
+
* at every level, because jsonb does not preserve key order and the digest
|
|
253
|
+
* must survive the round trip through the database.
|
|
254
|
+
*
|
|
255
|
+
* CONCURRENCY -- fixed. This used to be a SELECT of the last hash
|
|
256
|
+
* followed by an INSERT, from here, in two statements -- atomic only under a
|
|
257
|
+
* single writer, and a chain FORK under two. It is now one call to
|
|
258
|
+
* `audit_append()`, which takes `pg_advisory_xact_lock` on the chain, reads
|
|
259
|
+
* the predecessor and inserts, all inside one statement and therefore one
|
|
260
|
+
* transaction. See the long comment on that function in schema.sql, including
|
|
261
|
+
* what PGlite can and cannot prove about it.
|
|
262
|
+
*
|
|
263
|
+
* The canonical encoding still lives here and only here: this method computes
|
|
264
|
+
* everything in the digest input EXCEPT the predecessor hash (which it cannot
|
|
265
|
+
* know without racing) and hands it over as `hash_tail`. The database
|
|
266
|
+
* prepends the predecessor it read under the lock. `verifyAuditChain` then
|
|
267
|
+
* recomputes the entire digest in TypeScript on read, so the SQL side and the
|
|
268
|
+
* TypeScript side are checked against each other by every chain verification
|
|
269
|
+
* in the suite.
|
|
270
|
+
*
|
|
271
|
+
* CHAIN FLOODING -- AND WHY IT IS NOT FIXED HERE.
|
|
272
|
+
*
|
|
273
|
+
* An unauthenticated caller who guesses an org UUID can cause denials to be
|
|
274
|
+
* appended to that tenant's chain. Under the per-chain lock above that is
|
|
275
|
+
* worse than storage growth: the tenant's own requests each take the same
|
|
276
|
+
* lock on the way through their audit write, so a flood is a latency attack
|
|
277
|
+
* on that tenant's whole request path, not merely noise in their log. (That
|
|
278
|
+
* interaction is new with the per-chain lock and is worth stating on its own.)
|
|
279
|
+
*
|
|
280
|
+
* It still does not belong in this function:
|
|
281
|
+
*
|
|
282
|
+
* - P5 says every decision is recorded, INCLUDING denials, because denials
|
|
283
|
+
* are the security-relevant events. Any in-engine mitigation is a rule for
|
|
284
|
+
* DROPPING audit events, and a log with a "we stop recording under load"
|
|
285
|
+
* clause is worthless in exactly the incident it exists for.
|
|
286
|
+
* - The engine cannot distinguish a flood from reconnaissance. They are the
|
|
287
|
+
* same request; only the rate differs, and rate is not observable from
|
|
288
|
+
* inside a single decision.
|
|
289
|
+
* - Admission control is the layer that can see it, and it belongs above the
|
|
290
|
+
* engine.
|
|
291
|
+
*
|
|
292
|
+
* WHAT IS FIXED HERE: the blast radius. `orgExists` is project-scoped, so a
|
|
293
|
+
* caller can only reach a tenant chain inside a project they are already
|
|
294
|
+
* authenticated for; probes at every other org id land on the system chain.
|
|
295
|
+
* The exposure goes from "any internet caller can degrade any tenant" to "an
|
|
296
|
+
* authenticated customer can degrade their own tenant" -- a quota question.
|
|
297
|
+
* That reduction is asserted in test/semantics.test.ts.
|
|
298
|
+
*
|
|
299
|
+
* WHAT REMAINS AN OPERATIONAL REQUIREMENT ON THE API LAYER. Stated as a
|
|
300
|
+
* requirement, not a hope, and repeated in SEMANTICS.md:
|
|
301
|
+
*
|
|
302
|
+
* R1. Every request carries a project credential; no project, no engine.
|
|
303
|
+
* R2. Rate limit per (project, source address) BEFORE the engine runs.
|
|
304
|
+
* R3. Cap per-project audit append rate and shed with 429 -- never by
|
|
305
|
+
* dropping a decision that was actually made.
|
|
306
|
+
* R4. Alert on SYSTEM-chain append rate. That chain is where unattributable
|
|
307
|
+
* probes go, so its rate is the enumeration signal.
|
|
308
|
+
*/
|
|
309
|
+
audit(event: AuditInput): Promise<void>;
|
|
310
|
+
listAudit(orgId: string | null, filter?: {
|
|
311
|
+
decision?: 'allow' | 'deny';
|
|
312
|
+
fileId?: string;
|
|
313
|
+
actorId?: string;
|
|
314
|
+
action?: string;
|
|
315
|
+
limit?: number;
|
|
316
|
+
}): Promise<AuditRow[]>;
|
|
317
|
+
/**
|
|
318
|
+
* Full chain replay. Returns the first inconsistency found, if any.
|
|
319
|
+
* Pass `null` to verify the system chain.
|
|
320
|
+
*/
|
|
321
|
+
verifyAuditChain(orgId: string | null): Promise<AuditChainResult>;
|
|
322
|
+
/**
|
|
323
|
+
* The conditional write *is* the reservation, and it charges the whole
|
|
324
|
+
* ancestor chain (see `consume_download` in schema.sql). Never read the
|
|
325
|
+
* counter and then decide -- see the "naive" comparison in the test suite for
|
|
326
|
+
* what that costs.
|
|
327
|
+
*
|
|
328
|
+
* The function now always returns exactly one row, and this reads
|
|
329
|
+
* `granted === true` rather than defaulting a missing value. Both halves of
|
|
330
|
+
* that had to change: an explicit `(false, 0)` row makes the SQL side
|
|
331
|
+
* unambiguous, and an explicit `=== true` makes the TypeScript side fail
|
|
332
|
+
* closed even if the SQL side is ever replaced with something that returns
|
|
333
|
+
* nothing at all.
|
|
334
|
+
*/
|
|
335
|
+
consumeDownload(grantId: string): Promise<{
|
|
336
|
+
granted: boolean;
|
|
337
|
+
remaining: number | null;
|
|
338
|
+
}>;
|
|
339
|
+
recordUsage(orgId: string, kind: 'authz' | 'read' | 'write', bytes?: number): Promise<void>;
|
|
340
|
+
/**
|
|
341
|
+
* Distinct actors who own a file on a given day. `usage_daily` counts events;
|
|
342
|
+
* this counts PEOPLE, which is the quantity authorization load actually
|
|
343
|
+
* tracks -- the graph walk behind every decision grows with the number of
|
|
344
|
+
* distinct holders, not with how many bytes they hold. Idempotent per
|
|
345
|
+
* (org, day, actor).
|
|
346
|
+
*/
|
|
347
|
+
recordFileOwner(orgId: string, actorId: string): Promise<void>;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* A page is bounded so that one request cannot be turned into an unbounded
|
|
351
|
+
* scan, and so that the single audit event's `fileIds` array stays bounded too.
|
|
352
|
+
*/
|
|
353
|
+
export declare const LIST_MAX_LIMIT = 200;
|
|
354
|
+
export declare const LIST_DEFAULT_LIMIT = 50;
|
|
355
|
+
/**
|
|
356
|
+
* `(floor, held role) IN ((...),(...))` -- the group-grant threshold, generated
|
|
357
|
+
* from the derived cells rather than written as `m.role >= g.subject_min_role`.
|
|
358
|
+
*
|
|
359
|
+
* WHY NOT JUST `>=`. Postgres would happily compare two `org_role` values by
|
|
360
|
+
* their DECLARATION ORDER in the enum, and it would be correct today. It would
|
|
361
|
+
* also be a second, independent statement of the role ordering, sitting in SQL,
|
|
362
|
+
* agreeing with `ROLE_RANK` in authz.ts only by coincidence -- and reordering
|
|
363
|
+
* the enum (or inserting a value into the middle of it, which
|
|
364
|
+
* `ALTER TYPE ... ADD VALUE BEFORE` permits) would silently change who can read
|
|
365
|
+
* what, with no test failing. Generating the pairs from `roleMeets()` keeps one
|
|
366
|
+
* definition of the ordering, in TypeScript, where the point check reads it.
|
|
367
|
+
*
|
|
368
|
+
* A `role` grant with no floor is not representable (the CHECK requires one)
|
|
369
|
+
* and an `org` grant's NULL floor reads as 'viewer', which is what the coalesce
|
|
370
|
+
* says.
|
|
371
|
+
*
|
|
372
|
+
* Returns `false` when the cell list is empty, for the same reason
|
|
373
|
+
* `roleCellSql` returns null: `IN ()` is a syntax error, and a generator that
|
|
374
|
+
* crashes on a fail-CLOSED input is a generator someone will "fix".
|
|
375
|
+
*/
|
|
376
|
+
export declare function membershipCellSql(cells: readonly MembershipCell[]): string;
|
|
377
|
+
export interface AuditChainResult {
|
|
378
|
+
valid: boolean;
|
|
379
|
+
checked: number;
|
|
380
|
+
brokenAt?: number;
|
|
381
|
+
problem?: 'prev_hash_mismatch' | 'hash_mismatch';
|
|
382
|
+
}
|
|
383
|
+
export interface AuditHashInput {
|
|
384
|
+
prevHash: string | null;
|
|
385
|
+
orgId: string | null;
|
|
386
|
+
occurredAt: Date;
|
|
387
|
+
action: string;
|
|
388
|
+
decision: string;
|
|
389
|
+
actorId: string | null;
|
|
390
|
+
fileId: string | null;
|
|
391
|
+
reason?: string | null;
|
|
392
|
+
grantId?: string | null;
|
|
393
|
+
ip?: string | null;
|
|
394
|
+
userAgent?: string | null;
|
|
395
|
+
context?: Record<string, unknown> | null;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Canonical JSON: object keys sorted at every depth, so a value that has been
|
|
399
|
+
* through jsonb (which does not preserve insertion order) hashes identically to
|
|
400
|
+
* the value that was written.
|
|
401
|
+
*/
|
|
402
|
+
export declare function canonicalJson(v: unknown): unknown;
|
|
403
|
+
/**
|
|
404
|
+
* Everything in the digest input EXCEPT the predecessor hash, as the tail of a
|
|
405
|
+
* JSON array -- i.e. `orgId,...,context]`, with no leading bracket.
|
|
406
|
+
*
|
|
407
|
+
* This split is what lets `audit_append()` (schema.sql) take the chain lock,
|
|
408
|
+
* read the predecessor and compute the digest in ONE statement without any of
|
|
409
|
+
* the canonical encoding being duplicated in SQL. The database performs one
|
|
410
|
+
* concatenation:
|
|
411
|
+
*
|
|
412
|
+
* '[' || to_json(prev_hash) || ',' || tail
|
|
413
|
+
*
|
|
414
|
+
* `prevHash` is the first element of the array for exactly this reason, and
|
|
415
|
+
* moving it would silently break the chain -- which is why the ordering is
|
|
416
|
+
* asserted by a test rather than left to a comment.
|
|
417
|
+
*/
|
|
418
|
+
export declare function auditHashTail(input: Omit<AuditHashInput, 'prevHash'>): string;
|
|
419
|
+
export declare function auditHash(input: AuditHashInput): string;
|
|
420
|
+
export declare function isUuid(v: unknown): v is string;
|
|
421
|
+
/**
|
|
422
|
+
* Accept only what `inet` will take back out unchanged.
|
|
423
|
+
*
|
|
424
|
+
* Two reasons this is not paranoia. First, `host(inet)` is what the chain
|
|
425
|
+
* verifier reads, so any value Postgres would normalise (a CIDR suffix, for
|
|
426
|
+
* instance) would silently break tamper-evidence for every subsequent event.
|
|
427
|
+
* Second, an unparseable address would raise on INSERT, and since the audit
|
|
428
|
+
* write is on the critical path of every request, that turns a malformed
|
|
429
|
+
* `X-Forwarded-For` header into an outage.
|
|
430
|
+
*/
|
|
431
|
+
export declare function normalizeIp(v: string | null | undefined): string | null;
|
|
432
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|