pyric 0.1.0-alpha.25 → 0.1.0-alpha.27

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.
Files changed (60) hide show
  1. package/README.md +1 -1
  2. package/dist/database/connection-lifecycle.d.ts.map +1 -1
  3. package/dist/database/connection-lifecycle.js +10 -6
  4. package/dist/database/connection-lifecycle.js.map +1 -1
  5. package/dist/database/replay.d.ts +53 -1
  6. package/dist/database/replay.d.ts.map +1 -1
  7. package/dist/database/replay.js +236 -66
  8. package/dist/database/replay.js.map +1 -1
  9. package/dist/database/sandbox/backend.d.ts +5 -0
  10. package/dist/database/sandbox/backend.d.ts.map +1 -1
  11. package/dist/database/sandbox/backend.js +15 -0
  12. package/dist/database/sandbox/backend.js.map +1 -1
  13. package/dist/database/sandbox/child-listeners.d.ts.map +1 -1
  14. package/dist/database/sandbox/child-listeners.js +2 -0
  15. package/dist/database/sandbox/child-listeners.js.map +1 -1
  16. package/dist/database/sandbox/priority-writes.d.ts +4 -0
  17. package/dist/database/sandbox/priority-writes.d.ts.map +1 -1
  18. package/dist/database/sandbox/priority-writes.js +16 -3
  19. package/dist/database/sandbox/priority-writes.js.map +1 -1
  20. package/dist/database/sandbox/write-plane.d.ts +32 -0
  21. package/dist/database/sandbox/write-plane.d.ts.map +1 -1
  22. package/dist/database/sandbox/write-plane.js +91 -18
  23. package/dist/database/sandbox/write-plane.js.map +1 -1
  24. package/dist/rules/index.d.ts +3 -0
  25. package/dist/rules/index.d.ts.map +1 -1
  26. package/dist/rules/index.js +3 -0
  27. package/dist/rules/index.js.map +1 -1
  28. package/dist/rules/internal/rtdb.d.ts +8 -2
  29. package/dist/rules/internal/rtdb.d.ts.map +1 -1
  30. package/dist/rules/internal/rtdb.js +5 -1
  31. package/dist/rules/internal/rtdb.js.map +1 -1
  32. package/dist/rules/rtdb/grammar/canonical.d.ts +52 -0
  33. package/dist/rules/rtdb/grammar/canonical.d.ts.map +1 -0
  34. package/dist/rules/rtdb/grammar/canonical.js +328 -0
  35. package/dist/rules/rtdb/grammar/canonical.js.map +1 -0
  36. package/dist/rules/rtdb/grammar/expression-tree.d.ts +86 -0
  37. package/dist/rules/rtdb/grammar/expression-tree.d.ts.map +1 -0
  38. package/dist/rules/rtdb/grammar/expression-tree.js +212 -0
  39. package/dist/rules/rtdb/grammar/expression-tree.js.map +1 -0
  40. package/dist/rules/rtdb/rules-diff.d.ts +30 -0
  41. package/dist/rules/rtdb/rules-diff.d.ts.map +1 -0
  42. package/dist/rules/rtdb/rules-diff.js +81 -0
  43. package/dist/rules/rtdb/rules-diff.js.map +1 -0
  44. package/dist/rules/rtdb/simulation/handler.d.ts +9 -0
  45. package/dist/rules/rtdb/simulation/handler.d.ts.map +1 -1
  46. package/dist/rules/rtdb/simulation/handler.js +1 -1
  47. package/dist/rules/rtdb/simulation/handler.js.map +1 -1
  48. package/package.json +1 -1
  49. package/src/database/connection-lifecycle.ts +9 -11
  50. package/src/database/replay.ts +278 -72
  51. package/src/database/sandbox/backend.ts +13 -0
  52. package/src/database/sandbox/child-listeners.ts +2 -0
  53. package/src/database/sandbox/priority-writes.ts +18 -3
  54. package/src/database/sandbox/write-plane.ts +97 -19
  55. package/src/rules/index.ts +5 -0
  56. package/src/rules/internal/rtdb.ts +19 -1
  57. package/src/rules/rtdb/grammar/canonical.ts +339 -0
  58. package/src/rules/rtdb/grammar/expression-tree.ts +256 -0
  59. package/src/rules/rtdb/rules-diff.ts +118 -0
  60. package/src/rules/rtdb/simulation/handler.ts +1 -1
package/README.md CHANGED
@@ -149,7 +149,7 @@ Development sessions capture Firestore and Realtime Database operations in `.pyr
149
149
  npx pyric verify
150
150
  ```
151
151
 
152
- The default engine runs locally. The optional Firestore Rules Test API engine sends derived rule cases to Google's hosted evaluator when production-authority verification is needed. It verifies rules and does not deploy them. See [verify against a captured session](packages/site-docs/src/content/ship/ship-to-production.md).
152
+ The default engine runs locally. For production-authority verification, the optional Firestore Rules Test API engine sends derived rule cases to Google's hosted evaluator, and the optional `--engine staging` replays a Realtime Database session against a real instance you provide. They verify rules without deploying to a live app. See [verify against a captured session](packages/site-docs/src/content/ship/ship-to-production.md).
153
153
 
154
154
  ## Ship the same application code
155
155
 
@@ -1 +1 @@
1
- {"version":3,"file":"connection-lifecycle.d.ts","sourceRoot":"","sources":["../../src/database/connection-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAA4B,KAAK,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAErG,qBAAa,uBAAuB;IAQhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IATxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAC7D,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwC;IAC5E,OAAO,CAAC,eAAe,CAAS;gBAGb,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,SAAS,EACrB,KAAK,EAAE,OAAO;IAKjC,OAAO,CAAC,gBAAgB;IAQxB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,KAAK,IAAI,IAAI;IAKb,SAAS,IAAI,IAAI;IAQjB,QAAQ,IAAI,IAAI;IAKhB,iBAAiB,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAO9D,OAAO,CAAC,SAAS;IAOjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAoEvB"}
1
+ {"version":3,"file":"connection-lifecycle.d.ts","sourceRoot":"","sources":["../../src/database/connection-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAA4B,KAAK,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAErG,qBAAa,uBAAuB;IAQhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IATxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAC7D,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwC;IAC5E,OAAO,CAAC,eAAe,CAAS;gBAGb,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,SAAS,EACrB,KAAK,EAAE,OAAO;IAKjC,OAAO,CAAC,gBAAgB;IAQxB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,KAAK,IAAI,IAAI;IAKb,SAAS,IAAI,IAAI;IAQjB,QAAQ,IAAI,IAAI;IAKhB,iBAAiB,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAO9D,OAAO,CAAC,SAAS;IAOjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAoEvB"}
@@ -27,14 +27,18 @@ export class RtdbConnectionLifecycle {
27
27
  try {
28
28
  const requiresRules = !this.admin;
29
29
  if (requiresRules) {
30
- const isUpdate = operation.kind === 'update';
31
- if (isUpdate) {
32
- this.backend.validateUpdate(this.auth(), operation.path, operation.values);
30
+ // Decided when registered, as production decides it, and recorded as
31
+ // an `onDisconnect.*` operation so a captured session carries it.
32
+ if (operation.kind === 'update') {
33
+ this.backend.registerDisconnect(this.auth(), { kind: 'update', path: operation.path, values: operation.values });
34
+ }
35
+ else if (operation.kind === 'remove') {
36
+ this.backend.registerDisconnect(this.auth(), { kind: 'remove', path: operation.path });
33
37
  }
34
38
  else {
35
- const isRemove = operation.kind === 'remove';
36
- const priority = operation.kind === 'set' ? (operation.priority ?? null) : null;
37
- this.backend.validateSet(this.auth(), operation.path, isRemove ? null : operation.value, priority);
39
+ this.backend.registerDisconnect(this.auth(), {
40
+ kind: 'set', path: operation.path, value: operation.value, priority: operation.priority ?? null,
41
+ });
38
42
  }
39
43
  }
40
44
  this.operations.set(operation);
@@ -1 +1 @@
1
- {"version":3,"file":"connection-lifecycle.js","sourceRoot":"","sources":["../../src/database/connection-lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection-lifecycle.js","sourceRoot":"","sources":["../../src/database/connection-lifecycle.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAA4B,MAAM,iCAAiC,CAAC;AAErG,MAAM,OAAO,uBAAuB;IAQf;IACA;IACA;IATF,UAAU,GAAG,IAAI,wBAAwB,EAAE,CAAC;IACrD,QAAQ,GAAyB,IAAI,CAAC;IACtC,MAAM,GAAG,IAAI,CAAC;IACL,mBAAmB,GAAG,IAAI,GAAG,EAA6B,CAAC;IACpE,eAAe,CAAS;IAEhC,YACmB,OAAoB,EACpB,IAAqB,EACrB,KAAc;QAFd,YAAO,GAAP,OAAO,CAAa;QACpB,SAAI,GAAJ,IAAI,CAAiB;QACrB,UAAK,GAAL,KAAK,CAAS;QAE/B,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAC3D,CAAC;IAEO,gBAAgB;QACtB,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC;QAC5F,IAAI,mBAAmB;YAAE,OAAO;QAChC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC;IAChE,CAAC;IAED,QAAQ,CAAC,SAA8B;QACrC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;YAClC,IAAI,aAAa,EAAE,CAAC;gBAClB,qEAAqE;gBACrE,kEAAkE;gBAClE,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAChC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;gBACnH,CAAC;qBAAM,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACvC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzF,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;wBAC3C,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,IAAI;qBAChG,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,SAAS;QACP,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,SAAS;YAAE,OAAO;QACtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtB,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,iBAAiB,CAAC,IAA+B;QAC/C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEO,SAAS,CAAC,MAAe;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;QAC3C,IAAI,WAAW;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC;YAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,KAAK;QACH,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,MAAM,UAAU,GAAG,YAAY,KAAK,IAAI,CAAC;QACzC,IAAI,UAAU;YAAE,OAAO,YAAY,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,QAAQ,GAAc,EAAE,CAAC;YAC/B,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC;oBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;oBAC3B,IAAI,QAAQ,EAAE,CAAC;wBACb,IAAI,OAAO,EAAE,CAAC;4BACZ,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAmC,CAAC,CAAC;wBAC1F,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAmC,CAAC,CAAC;wBAClG,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC;wBAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC;wBAChD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC;wBACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;wBACxD,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS,CAAC;wBAC3C,MAAM,4BAA4B,GAAG,KAAK,IAAI,SAAS,CAAC,2BAA2B,KAAK,IAAI,CAAC;wBAC7F,MAAM,cAAc,GAAG,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;wBACnE,MAAM,oBAAoB,GAAG,4BAA4B,IAAI,cAAc,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wBACrG,IAAI,oBAAoB,EAAE,CAAC;4BACzB,IAAI,OAAO,EAAE,CAAC;gCACZ,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,KAAkC,CAAC,CAAC;gCAC7E,IAAI,WAAW,EAAE,CAAC;oCAChB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gCAC1D,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,KAAkC,CAAC,CAAC;gCACrF,IAAI,WAAW,EAAE,CAAC;oCAChB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gCAClE,CAAC;4BACH,CAAC;4BACD,SAAS;wBACX,CAAC;wBACD,IAAI,OAAO,EAAE,CAAC;4BACZ,IAAI,WAAW,EAAE,CAAC;gCAChB,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,EAAE,KAAkB,EAAE,QAAQ,CAAC,CAAC;4BAClF,CAAC;iCAAM,CAAC;gCACN,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,KAAkB,CAAC,CAAC;4BAC5D,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,IAAI,WAAW,EAAE,CAAC;gCAChB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,KAAkB,EAAE,QAAQ,CAAC,CAAC;4BAC1F,CAAC;iCAAM,CAAC;gCACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,KAAkB,CAAC,CAAC;4BACpE,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;YAC5C,IAAI,aAAa;gBAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAChD,IAAI,mBAAmB;gBAAE,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,yCAAyC,CAAC,CAAC;QACzG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import { type Sandbox, type SandboxEvent } from '../sandbox/index.js';
1
+ import { type Sandbox, type SandboxCommitEvent, type SandboxEvent, type SandboxOperationEvent } from '../sandbox/index.js';
2
2
  export interface RtdbReplayOptions {
3
3
  rules: {
4
4
  rules: Record<string, unknown>;
@@ -27,11 +27,22 @@ export interface RtdbReplayResult {
27
27
  replayedState: unknown;
28
28
  divergences: RtdbReplayDivergence[];
29
29
  }
30
+ /**
31
+ * A divergence replay found. `step` is the index, in `rtdbReplaySteps`, of the
32
+ * captured step it came from; a `state-drift` has none.
33
+ */
30
34
  export type RtdbReplayDivergence = {
35
+ step?: number;
36
+ } & ({
31
37
  kind: 'now-denied';
32
38
  path?: string;
33
39
  method?: string;
34
40
  reason?: string;
41
+ } | {
42
+ kind: 'now-allowed';
43
+ path?: string;
44
+ method?: string;
45
+ reason?: string;
35
46
  } | {
36
47
  kind: 'state-drift';
37
48
  path?: string;
@@ -42,6 +53,47 @@ export type RtdbReplayDivergence = {
42
53
  path?: string;
43
54
  method?: string;
44
55
  reason: string;
56
+ });
57
+ /**
58
+ * One captured event of an instance, as replay judges it. Every engine that
59
+ * checks a capture walks these in order, so they agree on which events carry
60
+ * a claim the candidate rules must keep:
61
+ *
62
+ * - `app-commit`: a write an application user made and the rules allowed.
63
+ * - `admin-commit`: an admin write; context, not checked.
64
+ * - `allowed-read`: a `get` or listener attach the rules allowed.
65
+ * - `denial`: an operation by an application user the rules denied.
66
+ * - `allowed-registration`: an `onDisconnect` registration the rules allowed.
67
+ */
68
+ export type RtdbReplayStep = {
69
+ kind: 'app-commit';
70
+ event: SandboxCommitEvent;
71
+ } | {
72
+ kind: 'admin-commit';
73
+ event: SandboxCommitEvent;
74
+ } | {
75
+ kind: 'allowed-read';
76
+ event: SandboxOperationEvent;
77
+ } | {
78
+ kind: 'denial';
79
+ event: SandboxOperationEvent;
80
+ } | {
81
+ kind: 'allowed-registration';
82
+ event: SandboxOperationEvent;
45
83
  };
84
+ /** The captured events of `instance` (name or URL; absent is the default instance), in order, as replay judges them. */
85
+ export declare function rtdbReplaySteps(events: readonly SandboxEvent[], instance?: string): RtdbReplayStep[];
86
+ /**
87
+ * The tree `instance` held when the session began: `capturedState`, the tree
88
+ * the session left it with, with the session's commits rewound. Priorities the
89
+ * rewind restores (a session write that replaced a prioritized node records
90
+ * its prior priority) appear as `.priority` keys, the export format the
91
+ * Realtime Database REST API reads; a prioritized leaf becomes
92
+ * `{ ".value": v, ".priority": p }`. A priority the capture never saw is not
93
+ * carried.
94
+ */
95
+ export declare function rewoundRtdbTree(events: readonly SandboxEvent[], capturedState: unknown, instance?: string): Promise<unknown>;
96
+ /** The paths where `actual` differs from `expected`, as `state-drift` divergences. */
97
+ export declare function rtdbStateDrift(expected: unknown, actual: unknown): RtdbReplayDivergence[];
46
98
  export declare function replay(events: readonly SandboxEvent[], opts: RtdbReplayOptions): Promise<RtdbReplayResult>;
47
99
  //# sourceMappingURL=replay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/database/replay.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,OAAO,EAEZ,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAC;AAsB7B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED,MAAM,MAAM,oBAAoB,GAC5B;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,wBAAsB,MAAM,CAC1B,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA4D3B"}
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/database/replay.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAoB7B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,CACnD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEP;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAEnE,wHAAwH;AACxH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CAapG;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,aAAa,EAAE,OAAO,EACtB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAYlB;AA2BD,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,oBAAoB,EAAE,CAIzF;AAED,wBAAsB,MAAM,CAC1B,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAuC3B"}
@@ -1,9 +1,81 @@
1
1
  import { assertCompleteHistory } from '../sandbox/internal/history-integrity.js';
2
2
  import { getClock, initializeSandbox, } from '../sandbox/index.js';
3
- import { get, getAdminDatabase, getDatabase, query, ref, remove, runTransaction, set, setPriority, setWithPriority, update, sandbox as rtdbSandbox, } from './index.js';
4
- import { buildConstraint } from './query-shape.js';
3
+ import { getAdminDatabase, getDatabase, ref, remove, runTransaction, set, setPriority, setWithPriority, update, sandbox as rtdbSandbox, } from './index.js';
5
4
  import { isJsonObject, jsonValuesEqual } from './sandbox/data-tree.js';
6
5
  import { resolveDatabaseInstance } from '../sandbox/internal/instances.js';
6
+ import { getOrCreateBackend } from './sandbox/backend-for.js';
7
+ /** The captured events of `instance` (name or URL; absent is the default instance), in order, as replay judges them. */
8
+ export function rtdbReplaySteps(events, instance) {
9
+ const name = resolveDatabaseInstance(instance)?.name;
10
+ const steps = [];
11
+ for (const event of events) {
12
+ if (instanceOf(event) !== name)
13
+ continue;
14
+ if (isAllowedRead(event))
15
+ steps.push({ kind: 'allowed-read', event });
16
+ else if (isAppDenial(event))
17
+ steps.push({ kind: 'denial', event });
18
+ else if (isAllowedRegistration(event))
19
+ steps.push({ kind: 'allowed-registration', event });
20
+ else if (isRtdbCommit(event)) {
21
+ steps.push(event.detail?.admin === true ? { kind: 'admin-commit', event } : { kind: 'app-commit', event });
22
+ }
23
+ }
24
+ return steps;
25
+ }
26
+ /**
27
+ * The tree `instance` held when the session began: `capturedState`, the tree
28
+ * the session left it with, with the session's commits rewound. Priorities the
29
+ * rewind restores (a session write that replaced a prioritized node records
30
+ * its prior priority) appear as `.priority` keys, the export format the
31
+ * Realtime Database REST API reads; a prioritized leaf becomes
32
+ * `{ ".value": v, ".priority": p }`. A priority the capture never saw is not
33
+ * carried.
34
+ */
35
+ export async function rewoundRtdbTree(events, capturedState, instance) {
36
+ const sandbox = initializeSandbox();
37
+ const name = resolveDatabaseInstance(instance)?.name;
38
+ const adminDb = getAdminDatabase(sandbox, name);
39
+ rtdbSandbox.setData(adminDb, { '/': capturedState ?? null });
40
+ const commits = events.filter((event) => instanceOf(event) === name && isRtdbCommit(event));
41
+ await rewindRtdbCommits(adminDb, commits);
42
+ const exported = getOrCreateBackend(sandbox, resolveDatabaseInstance(name)).exportPersistenceState();
43
+ return withExportedPriorities(exported.data ?? null, exported.priorities ?? {});
44
+ }
45
+ /** `tree` with each priority in `priorities` (by absolute path) set as a `.priority` key. */
46
+ function withExportedPriorities(tree, priorities) {
47
+ let out = structuredClone(tree);
48
+ for (const [path, priority] of Object.entries(priorities)) {
49
+ if (priority === null)
50
+ continue;
51
+ const segments = path.split('/').filter(Boolean);
52
+ const attach = (node) => {
53
+ if (node === null || node === undefined)
54
+ return node;
55
+ if (isJsonObject(node))
56
+ return { ...node, '.priority': priority };
57
+ return { '.value': node, '.priority': priority };
58
+ };
59
+ if (segments.length === 0) {
60
+ out = attach(out);
61
+ continue;
62
+ }
63
+ let parent = out;
64
+ for (const segment of segments.slice(0, -1)) {
65
+ parent = isJsonObject(parent) ? parent[segment] : undefined;
66
+ }
67
+ const last = segments.at(-1);
68
+ if (isJsonObject(parent) && last in parent)
69
+ parent[last] = attach(parent[last]);
70
+ }
71
+ return out;
72
+ }
73
+ /** The paths where `actual` differs from `expected`, as `state-drift` divergences. */
74
+ export function rtdbStateDrift(expected, actual) {
75
+ const out = [];
76
+ collectStateDrift(expected, actual, '/', out);
77
+ return out;
78
+ }
7
79
  export async function replay(events, opts) {
8
80
  assertCompleteHistory(events);
9
81
  const sandbox = initializeSandbox();
@@ -11,43 +83,22 @@ export async function replay(events, opts) {
11
83
  const db = getDatabase(sandbox, target.instance);
12
84
  const adminDb = getAdminDatabase(sandbox, target.instance);
13
85
  rtdbSandbox.setRules(db, opts.rules);
14
- const instanceEvents = events.filter((event) => instanceOf(event) === target.instance);
15
- const commits = instanceEvents.filter(isRtdbCommit);
86
+ const steps = rtdbReplaySteps(events, target.instance);
16
87
  const divergences = [];
17
88
  let checkedEvents = 0;
18
89
  const hasCapturedState = opts.capturedState !== undefined;
19
90
  if (hasCapturedState) {
91
+ // Rewound in this sandbox, not through `rewoundRtdbTree`: priorities live
92
+ // in the backend's metadata, and no tree export carries them.
20
93
  rtdbSandbox.setData(adminDb, { '/': opts.capturedState });
21
- await rewindRtdbCommits(adminDb, commits);
94
+ await rewindRtdbCommits(adminDb, steps.flatMap((step) => (step.kind === 'app-commit' || step.kind === 'admin-commit' ? [step.event] : [])));
22
95
  }
23
- for (const event of instanceEvents) {
24
- if (isAllowedQueryRead(event)) {
25
- checkedEvents += 1;
26
- await replayRtdbQueryRead(target, event, divergences);
27
- continue;
28
- }
29
- if (!isRtdbCommit(event))
30
- continue;
31
- const commit = event;
32
- const path = commit.path ?? '/';
33
- const isAdmin = commit.detail?.admin === true;
34
- if (isAdmin) {
35
- await replayRtdbAdminCommit(target, commit, divergences);
36
- continue;
37
- }
38
- checkedEvents += 1;
39
- try {
40
- await replayRtdbAppCommit(target, commit, divergences);
41
- }
42
- catch (e) {
43
- const isError = e instanceof Error;
44
- divergences.push({
45
- kind: 'now-denied',
46
- path,
47
- method: commit.method,
48
- reason: isError ? e.message : String(e),
49
- });
50
- }
96
+ for (const [index, step] of steps.entries()) {
97
+ const before = divergences.length;
98
+ await replayStep(target, step, divergences, () => { checkedEvents += 1; });
99
+ // Each divergence names the replay step it came from, so engines compare step for step.
100
+ for (const divergence of divergences.slice(before))
101
+ divergence.step = index;
51
102
  }
52
103
  const replayedState = rtdbSandbox.snapshotState(adminDb);
53
104
  if (hasCapturedState) {
@@ -61,6 +112,37 @@ export async function replay(events, opts) {
61
112
  divergences,
62
113
  };
63
114
  }
115
+ /** Replay one step under the candidate rules; `checked` counts a step that carries a claim. */
116
+ async function replayStep(target, step, divergences, checked) {
117
+ if (step.kind === 'admin-commit') {
118
+ await replayRtdbAdminCommit(target, step.event, divergences);
119
+ return;
120
+ }
121
+ checked();
122
+ if (step.kind === 'allowed-read') {
123
+ await replayRtdbRead(target, step.event, divergences);
124
+ }
125
+ else if (step.kind === 'denial') {
126
+ checkRtdbDecision(target, step.event, 'deny', divergences);
127
+ }
128
+ else if (step.kind === 'allowed-registration') {
129
+ checkRtdbDecision(target, step.event, 'allow', divergences);
130
+ }
131
+ else {
132
+ const commit = step.event;
133
+ try {
134
+ await replayRtdbAppCommit(target, commit, divergences);
135
+ }
136
+ catch (e) {
137
+ divergences.push({
138
+ kind: 'now-denied',
139
+ path: commit.path ?? '/',
140
+ method: commit.method,
141
+ reason: e instanceof Error ? e.message : String(e),
142
+ });
143
+ }
144
+ }
145
+ }
64
146
  /**
65
147
  * The instance an event names, or `undefined` for the default instance. An
66
148
  * event captured before events named their instance carries no field, so it
@@ -87,58 +169,146 @@ async function replayRtdbAppCommit({ sandbox, instance }, commit, divergences) {
87
169
  }
88
170
  }
89
171
  /**
90
- * A one-shot read by an application user that carried a query and was
91
- * allowed. Its `query.*` rule expressions are what the candidate rules are
92
- * judged on. A read with no query, an admin read, and a denied read carry no
93
- * claim the candidate rules must keep.
172
+ * A read by an application user that was allowed: a one-shot `get`, or the
173
+ * attach of a listener, whose first read the same `.read` rules decide. The
174
+ * candidate rules must keep allowing it: its `.read` rules, and the `query.*`
175
+ * rule expressions when it carried a query. An admin read and a denied read
176
+ * carry no claim the candidate rules must keep.
94
177
  */
95
- function isAllowedQueryRead(event) {
178
+ function isAllowedRead(event) {
96
179
  return event.kind === 'operation'
97
180
  && event.service === 'rtdb'
98
- && event.method === 'get'
181
+ && (event.method === 'get' || (event.method === 'listen' && event.origin === 'listener'))
99
182
  && event.origin !== 'admin'
100
- && event.result === 'allow'
101
- && event.request?.query !== undefined;
183
+ && event.result === 'allow';
102
184
  }
103
- /** The constraints that rebuild a captured query, in the order the SDK applies them. */
104
- function constraintsOfSpec(spec) {
105
- const constraints = [];
106
- if (spec.orderBy !== null) {
107
- const type = {
108
- child: 'orderByChild',
109
- key: 'orderByKey',
110
- priority: 'orderByPriority',
111
- value: 'orderByValue',
112
- };
113
- constraints.push(buildConstraint(type[spec.orderBy.kind], { kind: 'orderBy', spec: spec.orderBy }));
185
+ /**
186
+ * Decide an allowed read again under the candidate rules, by its `.read`
187
+ * rules and `query.*` expressions alone, against the replay tree at that
188
+ * point. The read is not run: a listener on an unindexed query only warns,
189
+ * where running it as a one-shot query would refuse it for the index.
190
+ */
191
+ async function replayRtdbRead({ sandbox, instance }, event, divergences) {
192
+ syncReplayClock(sandbox, event.at);
193
+ const path = event.path ?? '/';
194
+ const backend = getOrCreateBackend(sandbox, resolveDatabaseInstance(instance));
195
+ try {
196
+ backend.validateRead(event.auth, path, event.request?.query);
114
197
  }
115
- for (const bound of spec.bounds) {
116
- constraints.push(buildConstraint(bound.kind, { kind: 'bound', bound }));
198
+ catch (e) {
199
+ const reason = e instanceof Error ? e.message : String(e);
200
+ const denied = e.code === 'PERMISSION_DENIED';
201
+ divergences.push(denied
202
+ ? { kind: 'now-denied', path, method: event.method, reason }
203
+ : { kind: 'unsupported', path, method: event.method, reason });
117
204
  }
118
- if (spec.limit !== null) {
119
- constraints.push(buildConstraint(spec.limit.kind, { kind: 'limit', limitKind: spec.limit.kind, n: spec.limit.n }));
205
+ }
206
+ /**
207
+ * An operation by an application user that the rules denied. A candidate
208
+ * ruleset that allows it has opened access the captured rules kept closed.
209
+ */
210
+ function isAppDenial(event) {
211
+ return event.kind === 'operation'
212
+ && event.service === 'rtdb'
213
+ && event.origin !== 'admin'
214
+ && event.result === 'deny'
215
+ && !isRevocation(event);
216
+ }
217
+ /**
218
+ * A listener the rules stopped allowing after it attached, because of a write
219
+ * or a rules change. It is a consequence, not a request: its attach was
220
+ * checked as an allowed read, and the write that caused it is checked itself.
221
+ */
222
+ function isRevocation(event) {
223
+ return event.detail?.revoked === true;
224
+ }
225
+ /**
226
+ * An `onDisconnect` registration by an application user that the rules
227
+ * allowed. Production decides a registration when it is made, so the
228
+ * candidate rules must keep allowing it at that point in the session.
229
+ */
230
+ function isAllowedRegistration(event) {
231
+ return event.kind === 'operation'
232
+ && event.service === 'rtdb'
233
+ && event.origin !== 'admin'
234
+ && event.result === 'allow'
235
+ && typeof event.method === 'string'
236
+ && event.method.startsWith('onDisconnect.');
237
+ }
238
+ /**
239
+ * The backend check that decides a captured operation again under the
240
+ * candidate rules, against the replay tree as it stands at that point in the
241
+ * session, without writing or emitting an event; or the reason it cannot be
242
+ * decided from what the capture holds.
243
+ */
244
+ function decisionCheck(backend, event) {
245
+ const path = event.path ?? '/';
246
+ const data = event.request?.data;
247
+ const detail = (event.detail ?? {});
248
+ switch (event.method) {
249
+ case 'get':
250
+ case 'listen':
251
+ return () => backend.validateRead(event.auth, path, event.request?.query);
252
+ case 'set':
253
+ case 'transaction':
254
+ return () => backend.validateSet(event.auth, path, data ?? null, (detail.priority ?? null));
255
+ case 'remove':
256
+ return () => backend.validateSet(event.auth, path, null);
257
+ case 'update':
258
+ if (!isJsonObject(detail.patch) || typeof detail.rootPath !== 'string') {
259
+ return 'the capture records only the denied path of this update, not the paths written with it, so the update cannot be rebuilt.';
260
+ }
261
+ return () => backend.validateUpdate(event.auth, detail.rootPath, detail.patch);
262
+ case 'setPriority':
263
+ return () => backend.validatePriority(event.auth, path, data);
264
+ case 'onDisconnect.set':
265
+ return () => backend.validateSet(event.auth, path, data ?? null, (detail.priority ?? null));
266
+ case 'onDisconnect.remove':
267
+ return () => backend.validateSet(event.auth, path, null);
268
+ case 'onDisconnect.update':
269
+ if (!isJsonObject(data))
270
+ return 'the captured onDisconnect update did not contain an object patch.';
271
+ return () => backend.validateUpdate(event.auth, path, data);
272
+ default:
273
+ return `RTDB replay does not check '${event.method}' operations.`;
120
274
  }
121
- return constraints;
122
275
  }
123
- async function replayRtdbQueryRead({ sandbox, instance }, event, divergences) {
276
+ /**
277
+ * Decide a captured operation again under the candidate rules. `captured` is
278
+ * the verdict the session's rules gave: a denial the candidate rules allow is
279
+ * `now-allowed`, an allowed registration they deny is `now-denied`.
280
+ */
281
+ function checkRtdbDecision({ sandbox, instance }, event, captured, divergences) {
124
282
  syncReplayClock(sandbox, event.at);
125
283
  const path = event.path ?? '/';
126
- const prev = sandbox.currentUser;
127
- sandbox.currentUser = event.auth;
284
+ const check = decisionCheck(getOrCreateBackend(sandbox, resolveDatabaseInstance(instance)), event);
285
+ if (typeof check === 'string') {
286
+ divergences.push({ kind: 'unsupported', path, method: event.method, reason: check });
287
+ return;
288
+ }
289
+ let allowed = true;
290
+ let reason;
128
291
  try {
129
- const db = getDatabase(sandbox, instance);
130
- await get(query(ref(db, path), ...constraintsOfSpec(event.request?.query)));
292
+ check();
131
293
  }
132
294
  catch (e) {
295
+ reason = e instanceof Error ? e.message : String(e);
296
+ if (e.code !== 'PERMISSION_DENIED') {
297
+ divergences.push({ kind: 'unsupported', path, method: event.method, reason });
298
+ return;
299
+ }
300
+ allowed = false;
301
+ }
302
+ if (captured === 'deny' && allowed) {
133
303
  divergences.push({
134
- kind: 'now-denied',
304
+ kind: 'now-allowed',
135
305
  path,
136
306
  method: event.method,
137
- reason: e instanceof Error ? e.message : String(e),
307
+ reason: 'the captured rules denied this operation; the candidate rules allow it.',
138
308
  });
139
309
  }
140
- finally {
141
- sandbox.currentUser = prev;
310
+ else if (captured === 'allow' && !allowed) {
311
+ divergences.push({ kind: 'now-denied', path, method: event.method, reason });
142
312
  }
143
313
  }
144
314
  async function replayRtdbAdminCommit({ sandbox, instance }, commit, divergences) {
@@ -1 +1 @@
1
- {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/database/replay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/database/replay.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  import type { AuthState, Sandbox } from 'pyric/sandbox';
7
7
  import type { ChildListener, ValueListenerSnapshot } from './listener-types.js';
8
8
  import type { Priority, QueryRow, QuerySpec } from './query.js';
9
+ import { WritePlane } from './write-plane.js';
9
10
  import type { JsonValue } from './data-tree.js';
10
11
  import type { ListenerAttribution } from '../../sandbox/attribution/listener-owners.js';
11
12
  export declare class RtdbBackend {
@@ -50,6 +51,10 @@ export declare class RtdbBackend {
50
51
  update(auth: AuthState, path: string, patch: Record<string, JsonValue>): void;
51
52
  remove(auth: AuthState, path: string): void;
52
53
  setPriority(auth: AuthState, path: string, priority: Priority): void;
54
+ validateRead(auth: AuthState, path: string, spec?: QuerySpec): void;
55
+ validatePriority(auth: AuthState, path: string, priority: Priority): void;
56
+ /** Decide and record an `onDisconnect` registration; see `WritePlane.registerDisconnect`. */
57
+ registerDisconnect(auth: AuthState, operation: Parameters<WritePlane['registerDisconnect']>[1]): void;
53
58
  validateSet(auth: AuthState, path: string, value: unknown, priority?: Priority): void;
54
59
  validateUpdate(auth: AuthState, path: string, patch: Record<string, unknown>): void;
55
60
  onValue(auth: AuthState, path: string, cb: (snap: ValueListenerSnapshot) => void, query?: QuerySpec, cancelCallback?: (error: Error) => void, onCanceled?: () => void, attribution?: ListenerAttribution): () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/database/sandbox/backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/database/sandbox/backend.ts"],"names":[],"mappings":"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"}