footprintjs 10.5.0 → 10.6.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.
Files changed (61) hide show
  1. package/dist/esm/index.d.ts +1 -0
  2. package/dist/esm/index.js +1 -1
  3. package/dist/esm/lib/capture/readSources.d.ts +13 -2
  4. package/dist/esm/lib/capture/readSources.js +11 -3
  5. package/dist/esm/lib/capture/sourceOwnership.d.ts +21 -0
  6. package/dist/esm/lib/capture/sourceOwnership.js +133 -0
  7. package/dist/esm/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  8. package/dist/esm/lib/capture/sourceOwnershipFormat.js +31 -0
  9. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +5 -1
  10. package/dist/esm/lib/capture/storedReadSourceCounts.js +15 -11
  11. package/dist/esm/lib/capture/storedReadSources.js +21 -5
  12. package/dist/esm/lib/capture/storedSourceOwnership.d.ts +8 -0
  13. package/dist/esm/lib/capture/storedSourceOwnership.js +100 -0
  14. package/dist/esm/lib/engine/handlers/StageRunner.js +2 -1
  15. package/dist/esm/lib/memory/StageContext.d.ts +3 -0
  16. package/dist/esm/lib/memory/StageContext.js +29 -8
  17. package/dist/esm/lib/memory/frameTypes.d.ts +2 -0
  18. package/dist/esm/lib/memory/frameTypes.js +1 -1
  19. package/dist/esm/lib/sinks/indexedAdmission.d.ts +14 -0
  20. package/dist/esm/lib/sinks/indexedAdmission.js +77 -0
  21. package/dist/esm/lib/sinks/indexedIO.d.ts +14 -0
  22. package/dist/esm/lib/sinks/indexedIO.js +96 -0
  23. package/dist/esm/lib/sinks/indexedRecordFile.d.ts +3 -0
  24. package/dist/esm/lib/sinks/indexedRecordFile.js +120 -0
  25. package/dist/esm/lib/sinks/indexedScan.d.ts +6 -0
  26. package/dist/esm/lib/sinks/indexedScan.js +73 -0
  27. package/dist/esm/lib/sinks/indexedTypes.d.ts +60 -0
  28. package/dist/esm/lib/sinks/indexedTypes.js +2 -0
  29. package/dist/esm/sinks.d.ts +2 -0
  30. package/dist/esm/sinks.js +2 -1
  31. package/dist/index.js +1 -1
  32. package/dist/lib/capture/readSources.js +11 -3
  33. package/dist/lib/capture/sourceOwnership.js +138 -0
  34. package/dist/lib/capture/sourceOwnershipFormat.js +35 -0
  35. package/dist/lib/capture/storedReadSourceCounts.js +15 -11
  36. package/dist/lib/capture/storedReadSources.js +21 -5
  37. package/dist/lib/capture/storedSourceOwnership.js +104 -0
  38. package/dist/lib/engine/handlers/StageRunner.js +2 -1
  39. package/dist/lib/memory/StageContext.js +29 -8
  40. package/dist/lib/memory/frameTypes.js +1 -1
  41. package/dist/lib/sinks/indexedAdmission.js +85 -0
  42. package/dist/lib/sinks/indexedIO.js +106 -0
  43. package/dist/lib/sinks/indexedRecordFile.js +124 -0
  44. package/dist/lib/sinks/indexedScan.js +77 -0
  45. package/dist/lib/sinks/indexedTypes.js +3 -0
  46. package/dist/sinks.js +4 -2
  47. package/dist/types/index.d.ts +1 -0
  48. package/dist/types/lib/capture/readSources.d.ts +13 -2
  49. package/dist/types/lib/capture/sourceOwnership.d.ts +21 -0
  50. package/dist/types/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  51. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +5 -1
  52. package/dist/types/lib/capture/storedSourceOwnership.d.ts +8 -0
  53. package/dist/types/lib/memory/StageContext.d.ts +3 -0
  54. package/dist/types/lib/memory/frameTypes.d.ts +2 -0
  55. package/dist/types/lib/sinks/indexedAdmission.d.ts +14 -0
  56. package/dist/types/lib/sinks/indexedIO.d.ts +14 -0
  57. package/dist/types/lib/sinks/indexedRecordFile.d.ts +3 -0
  58. package/dist/types/lib/sinks/indexedScan.d.ts +6 -0
  59. package/dist/types/lib/sinks/indexedTypes.d.ts +60 -0
  60. package/dist/types/sinks.d.ts +2 -0
  61. package/package.json +1 -1
@@ -95,6 +95,8 @@ export type StageSnapshot = {
95
95
  stageReads?: Record<string, unknown>;
96
96
  /** Native source-read totals across all attempts, only with an owned source book. No values or names. */
97
97
  readSourceCounts?: SourceReadCounts;
98
+ /** Number of native stage-function entries, independent of read retention and ownership-list budgets. */
99
+ readSourceInvocations?: number;
98
100
  logs: Record<string, unknown>;
99
101
  errors: Record<string, unknown>;
100
102
  metrics: Record<string, unknown>;
@@ -13,4 +13,4 @@
13
13
  * `commitStops`, `tagStops` and `keysReadFromExecutionTree` take one.
14
14
  */
15
15
  export {};
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWVUeXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2ZyYW1lVHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZnJhbWVUeXBlcy50cyDigJQgdGhlIHR5cGVzIG9mIHRoZSBlbmdpbmUncyBmcmFtZSAoTDQpOiB3aGF0IG9uZSBzdGFnZSBpbnNpZGUgYSBydW4gcmVwb3J0cy5cbiAqXG4gKiBJdHMgc25hcHNob3QgKGBTdGFnZVNuYXBzaG90YCwgb25lIG5vZGUgb2YgdGhlIGV4ZWN1dGlvbiB0cmVlKSwgaXRzIGZsb3cgbWVzc2FnZXNcbiAqIChgRmxvd01lc3NhZ2VgLCBgRmxvd0NvbnRyb2xUeXBlYCkgYW5kIHRoZSB0d28gcmV0ZW50aW9uIGRpYWxzIHRoYXQgc2hhcGUgd2hhdCB0aGUgc25hcHNob3RcbiAqIGtlZXBzIChgUmVhZFRyYWNraW5nTW9kZWAsIGBXcml0ZVRyYWNraW5nTW9kZWAsIG92ZXIgYGNhcHR1cmUvYCdzIGBSZXRlbnRpb25Qb2xpY3lgKS4gVGhleSBsaXZlZFxuICogaW4gdGhlIHJlY29yZCdzIGB0eXBlcy50c2AgdW50aWwgQzY7IHRoZSByZWNvcmQgbmFtZXMgbm90aGluZyBvdXRzaWRlIGl0c2VsZiBub3dcbiAqIChgUkVDT1JEX0ZJTEVTYCwgc2NyaXB0cy9sYXllcmluZy5jb25maWcuY2pzKSwgc28gdGhleSBzaXQgYmVzaWRlIHRoZSBmcmFtZSB0aGF0IHdyaXRlcyB0aGVtLlxuICpcbiAqIEEgcmV0cmllZCBzdGFnZSdzIG5vZGUgYWxzbyBjYXJyaWVzIGl0cyBhdHRlbXB0cyAoYGF0dGVtcHRzYCwgYGF0dGVtcHRTdW1tYXJ5YCDigJQgdGhlIGF0dGVtcHQgbGVhZidzIHR5cGVzLCBMMCkuXG4gKlxuICogQSBgU3RhZ2VTbmFwc2hvdGAgaXMgYW4gYEV4ZWN1dGlvblRyZWVgIChgdHlwZXMudHNgKSwgdGhlIHNoYXBlIHRoZSByZWNvcmQncyByZWFkZXJzIHdhbGs6XG4gKiBgY29tbWl0U3RvcHNgLCBgdGFnU3RvcHNgIGFuZCBga2V5c1JlYWRGcm9tRXhlY3V0aW9uVHJlZWAgdGFrZSBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRlbnRpb24gfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRSZWNvcmQsIEF0dGVtcHRTdW1tYXJ5LCBMYXRlV3JpdGUgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5IH0gZnJvbSAnLi4vY2FwdHVyZS9wb2xpY2llcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZVJlYWRDb3VudHMgfSBmcm9tICcuLi9jYXB0dXJlL3NvdXJjZVJlYWRDb3VudHMuanMnO1xuXG4vLyDilIDilIAgRmxvdyBDb250cm9sIE5hcnJhdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFR5cGVzIG9mIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMgY2FwdHVyZWQgYnkgdGhlIGV4ZWN1dGlvbiBlbmdpbmUuICovXG5leHBvcnQgdHlwZSBGbG93Q29udHJvbFR5cGUgPSAnbmV4dCcgfCAnYnJhbmNoJyB8ICdjaGlsZHJlbicgfCAnc2VsZWN0ZWQnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnO1xuXG4vKiogQSBzaW5nbGUgZmxvdyBjb250cm9sIG5hcnJhdGl2ZSBlbnRyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd01lc3NhZ2Uge1xuICB0eXBlOiBGbG93Q29udHJvbFR5cGU7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHJhdGlvbmFsZT86IHN0cmluZztcbiAgY291bnQ/OiBudW1iZXI7XG4gIGl0ZXJhdGlvbj86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgUmVhZCAvIFdyaXRlIFRyYWNraW5nICgjMTQsICMxM2MtQSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gVGhlIHBvbGljeSBmYW1pbHkgYW5kIG1hcmtlciBzaGFwZXMgYXJlIG93bmVkIGJ5IGBjYXB0dXJlL2AgKHNoYXJlZCB3aXRoXG4vLyB0aGUgZGVmZXJyZWQtb2JzZXJ2ZXIgY2FwdHVyZSB0aWVyKS5cblxuLyoqXG4gKiBQb2xpY3kgZm9yIGhvdyB0cmFja2VkIHJlYWRzIGFyZSByZWNvcmRlZCBpbnRvIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgLlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHJlYWQgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvXG4gKiAgIHRoZSBzdGFnZSdzIHJlYWQgdmlldy4gQnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgYmVoYXZpb3I7IHRoaXMgaXNcbiAqICAgd2hhdCBzbmFwc2hvdCBjb25zdW1lcnMgKGxlbnMsIGFnZW50Zm9vdHByaW50KSBzZWUgdG9kYXkuXG4gKiAtIGAnc3VtbWFyeSdgIOKAlCByZWFkcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9ICh0eXBlICsgc2l6ZVxuICogICBwcm94eSArIHNob3J0IHByZXZpZXcpIGluc3RlYWQgb2YgdGhlIGNsb25lZCB2YWx1ZS4gTygxKS1pc2ggcGVyIHJlYWQg4oCUXG4gKiAgIG5vIHZhbHVlIGNsb25lLCBubyBzZXJpYWxpemF0aW9uIG9mIGxhcmdlIG9iamVjdHMuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHJlYWRzIGFyZSBub3QgcmVjb3JkZWQgYXQgYWxsOyBgc3RhZ2VSZWFkc2AgaXMgYWJzZW50IGZyb20gdGhlXG4gKiAgIHNuYXBzaG90LiBaZXJvIHBlci1yZWFkIGNvc3QuIFZhbHVlcyBhcmUgc3RpbGwgcmVhZGFibGUsIGFuZCB0aGVcbiAqICAgYFNjb3BlUmVjb3JkZXIub25SZWFkYCBldmVudCBzdGlsbCBmaXJlcyAoaXQgcGFzc2VzIHRoZSBsaXZlIHJlZmVyZW5jZSBhbmRcbiAqICAgbmV2ZXIgY2xvbmVkKSDigJQgc28gbmFycmF0aXZlIG91dHB1dCBpcyBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS4gVGhlIHBvbGljeVxuICogICBzY29wZXMgT05MWSB0aGUgc25hcHNob3QncyBgc3RhZ2VSZWFkc2AgcGF5bG9hZC5cbiAqXG4gKiBTZXQgdmlhIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgKGJlZm9yZSBgcnVuKClgKS5cbiAqXG4gKiBBbGlhcyBvZiB0aGUgc2hhcmVkIHtAbGluayBSZXRlbnRpb25Qb2xpY3l9IGZhbWlseSAoIzEzYy1BKSDigJQga2VwdCBhcyB0aGVcbiAqIHNoaXBwZWQgcHVibGljIG5hbWUgZm9yIHRoZSByZWFkIGRpYWwuXG4gKi9cbmV4cG9ydCB0eXBlIFJlYWRUcmFja2luZ01vZGUgPSBSZXRlbnRpb25Qb2xpY3k7XG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgdHJhY2tlZCB3cml0ZXMgYXJlIHJlY29yZGVkIGludG8gYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgXG4gKiAoIzEzYy1BKSDigJQgdGhlIHNpYmxpbmcgb2Yge0BsaW5rIFJlYWRUcmFja2luZ01vZGV9LlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHdyaXRlIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50b1xuICogICB0aGUgc3RhZ2UncyB3cml0ZSB2aWV3LiBCeXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvci5cbiAqIC0gYCdzdW1tYXJ5J2Ag4oCUIHdyaXRlcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgV3JpdGVTdW1tYXJ5TWFya2VyfSBpbnN0ZWFkIG9mXG4gKiAgIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHdyaXRlcyBhcmUgbm90IHJlY29yZGVkIGF0IGFsbDsgYHN0YWdlV3JpdGVzYCBpcyBhYnNlbnQgZnJvbSB0aGVcbiAqICAgc25hcHNob3QuIFRoZSB3cml0ZXMgdGhlbXNlbHZlcyBzdGlsbCBjb21taXQgdG8gc2hhcmVkIHN0YXRlIGFuZCBzdGlsbFxuICogICBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cg4oCUIG9ubHkgdGhlIHBlci1zdGFnZSBzbmFwc2hvdCBib29ra2VlcGluZyAoYW5kXG4gKiAgIHRoZXJlZm9yZSB0aGUgY29tbWl0IG9ic2VydmVyJ3MgbXV0YXRpb25zIHBheWxvYWQpIGlzIGFmZmVjdGVkLiAoVGhlXG4gKiAgIGNvbW1pdCBsb2cncyBvd24gdmFsdWUgZW5jb2RpbmcgaGFzIGl0cyBvd24gbG9zc2xlc3MgZGlhbCDigJRcbiAqICAge0BsaW5rIENvbW1pdFZhbHVlc01vZGV9LCAjMTNjLUIuKVxuICpcbiAqIFNldCB2aWEgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyB3cml0ZVRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuIFNlZVxuICogYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nYCBmb3IgdGhlIGZ1bGwgb2JzZXJ2YWJsZS1jb25zZXF1ZW5jZVxuICogY29udHJhY3QgKG9uQ29tbWl0IHBheWxvYWQsIHJlZGFjdGlvbiBwcmVjZWRlbmNlLCB3aGF0IGlzIE9VVCBvZiBzY29wZSkuXG4gKi9cbmV4cG9ydCB0eXBlIFdyaXRlVHJhY2tpbmdNb2RlID0gUmV0ZW50aW9uUG9saWN5O1xuXG4vLyDilIDilIAgU3RhZ2UgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBTZXJpYWxpc2FibGUgcmVwcmVzZW50YXRpb24gb2YgYSBzdGFnZSdzIHN0YXRlIChmb3IgZGVidWdnaW5nIC8gdmlzdWFsaXNhdGlvbikuICovXG5leHBvcnQgdHlwZSBTdGFnZVNuYXBzaG90ID0ge1xuICBpZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleCAqL1xuICBydW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBzdGFnZSBkb2VzIChmcm9tIGJ1aWxkZXIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciDigJQgcHJlc2VudCB3aGVuIHRoaXMgc3RhZ2UgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50LiAqL1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIGlzRGVjaWRlcj86IGJvb2xlYW47XG4gIGlzRm9yaz86IGJvb2xlYW47XG4gIC8qKiBVc2VyLWxldmVsIHdyaXRlcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzKS5cbiAgICogIFNoYXBlIGRlcGVuZHMgb24ge0BsaW5rIFdyaXRlVHJhY2tpbmdNb2RlfTogY2xvbmVkIHZhbHVlcyB1bmRlciBgJ2Z1bGwnYFxuICAgKiAgKGRlZmF1bHQpLCB7QGxpbmsgV3JpdGVTdW1tYXJ5TWFya2VyfXMgdW5kZXIgYCdzdW1tYXJ5J2AsIGFic2VudCB1bmRlclxuICAgKiAgYCdvZmYnYC4gUmVkYWN0ZWQgd3JpdGVzIHNob3cgYCdbUkVEQUNURURdJ2AgcmVnYXJkbGVzcyBvZiBtb2RlLiAqL1xuICBzdGFnZVdyaXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogVXNlci1sZXZlbCByZWFkcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzIGF0IHJlYWRcbiAgICogIHRpbWUpLiBTaGFwZSBkZXBlbmRzIG9uIHtAbGluayBSZWFkVHJhY2tpbmdNb2RlfTogY2xvbmVkIHZhbHVlcyB1bmRlclxuICAgKiAgYCdmdWxsJ2AgKGRlZmF1bHQpLCB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9cyB1bmRlciBgJ3N1bW1hcnknYCwgYWJzZW50XG4gICAqICB1bmRlciBgJ29mZidgLiAqL1xuICBzdGFnZVJlYWRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBOYXRpdmUgc291cmNlLXJlYWQgdG90YWxzIGFjcm9zcyBhbGwgYXR0ZW1wdHMsIG9ubHkgd2l0aCBhbiBvd25lZCBzb3VyY2UgYm9vay4gTm8gdmFsdWVzIG9yIG5hbWVzLiAqL1xuICByZWFkU291cmNlQ291bnRzPzogU291cmNlUmVhZENvdW50cztcbiAgbG9nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVycm9yczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIG1ldHJpY3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBldmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZsb3dNZXNzYWdlcz86IEZsb3dNZXNzYWdlW107XG4gIC8qKlxuICAgKiBFdmVyeSBhdHRlbXB0IG9mIHRoaXMgZXhlY3V0aW9uLCBpbiBvcmRlciDigJQgd2hlbiBpdCBzdGFydGVkLCBob3cgbG9uZyBpdCB0b29rLCBob3cgaXQgZW5kZWQsIGFuZCB0aGVcbiAgICogcmV0cnktb3Itc3RvcCBkZWNpc2lvbiB0aGF0IGZvbGxvd2VkIChgQXR0ZW1wdFJlY29yZGApOiB0aGUgc3RhZ2UncyBvd24gdW5kZXIgaXRzIHJldHJ5IHBvbGljeSwgYSBgdGltZW91dE1zYFxuICAgKiBvciBhIHJ1biBkZWFkbGluZSAoMTAuMSwgYGtpbmQ6ICdzdGFnZSdgKSwgYW5kIHRob3NlIG9mIHRoZSBjYWxscyBpdCBtYWRlIHRocm91Z2ggYHNjb3BlLiRjYWxsYCBhbmQgdGhlXG4gICAqIG91dHNpZGUgYXR0ZW1wdHMgaXQgcmVwb3J0ZWQgdGhyb3VnaCBgb2JzZXJ2ZWQoKWAgKFAyLCBga2luZDogJ2NhbGwnYCAvIGAnb2JzZXJ2ZWQnYCwgdGhlIGZpcnN0IDEwMDAg4oCUXG4gICAqIGBTdGFnZUNvbnRleHQgwrcgTUFYX0NBTExfUkVDT1JEU2ApLiBBYnNlbnQgd2hlbiB0aGVyZSBhcmUgbm9uZS4gVGhlIGNvbW1pdCBsb2cgbmV2ZXIgY2FycmllcyBhdHRlbXB0czogYVxuICAgKiByZXRyaWVkIHN0YWdlIGlzIHN0aWxsIE9ORSBidW5kbGUuXG4gICAqL1xuICBhdHRlbXB0cz86IHJlYWRvbmx5IEF0dGVtcHRSZWNvcmRbXTtcbiAgLyoqXG4gICAqIENhbGwgYW5kIG9ic2VydmVkIGF0dGVtcHQgcmVjb3JkcyB0aGlzIGV4ZWN1dGlvbiBtYWRlIHBhc3QgdGhlIGZpcnN0IDEwMDAg4oCUIGNvdW50ZWQsIG5vdCBrZXB0IChlYWNoIHN0aWxsXG4gICAqIGZpcmVkIGBvbkF0dGVtcHRgKS4gQWJzZW50IHdoZW4gbm9uZSB3ZXJlIGRyb3BwZWQuXG4gICAqL1xuICBhdHRlbXB0c0Ryb3BwZWQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgc2VyaWVzIGF0IGEgZ2xhbmNlIOKAlCBjb3VudHMgcGVyIG91dGNvbWUsIGFuZCBob3cgaXQgZW5kZWQuIFN0YW1wZWQgd2hlbiB0aGUgc2VyaWVzIGVuZHM6IGFic2VudCB3aGlsZSBpdFxuICAgKiBpcyBzdGlsbCBydW5uaW5nIChhIHNuYXBzaG90IHRha2VuIG1pZC1zdGFnZSkgYW5kIHdpdGhvdXQgYSBwb2xpY3kuXG4gICAqL1xuICBhdHRlbXB0U3VtbWFyeT86IEF0dGVtcHRTdW1tYXJ5O1xuICAvKipcbiAgICogV3JpdGVzIChhbmQgZW1pdHMpIGFuIGF0dGVtcHQgdHJpZWQgQUZURVIgaXQgaGFkIGVuZGVkIOKAlCB0aW1lZCBvdXQsIGFib3J0ZWQgb3IgZmFpbGVkIOKAlCBpbiB0aGUgb3JkZXIgdGhleSBjYW1lXG4gICAqIChQMWIpLiBFYWNoIHdhcyBkcm9wcGVkIGF0IHRoZSBzY29wZSwgc28gbm9uZSByZWFjaGVkIHRoZSBzdGFnZSdzIGJ1ZmZlciwgaXRzIGNvbW1pdCBvciBhIHJlY29yZGVyOyB0aGlzIGlzXG4gICAqIHRoZSByZWNvcmQgdGhhdCB0aGV5IHdlcmUgdHJpZWQg4oCUIHRoZSBmaXJzdCAxMDAgKGBNQVhfTEFURV9XUklURVNgKS4gQW4gYWJhbmRvbmVkIGZ1bmN0aW9uIGNhbiBrZWVwIHJ1bm5pbmdcbiAgICogYWZ0ZXIgdGhlIHJ1biBlbmRlZCwgc28gdGhlIGxpc3QgY2FuIGdyb3cgYWZ0ZXIgYSBzbmFwc2hvdCB3YXMgdGFrZW4uIE5hbWVzIG9ubHksIG5ldmVyIHZhbHVlcy4gQWJzZW50IHdoZW5cbiAgICogdGhlcmUgd2VyZSBub25lLlxuICAgKi9cbiAgbGF0ZVdyaXRlcz86IHJlYWRvbmx5IExhdGVXcml0ZVtdO1xuICAvKipcbiAgICogRml4ZWQtcmVhc29uIG1hcmtzIGNvbGxlY3RlZCBhcyB0aGlzIGV4ZWN1dGlvbiBydW5zLiBBYnNlbnQgd2hlbiBubyBmYWN0IG5lZWRzIGF0dGVudGlvbi5cbiAgICogQXR0ZW1wdCBldmlkZW5jZSB1c2VzIGNhbm9uaWNhbCBGb290dHJhY2UgYXR0ZW1wdCBJRHMuIFN1bW1hcnktb25seSBhbmQgc3RhZ2UtZXJyb3IgcHJvb2YgcmVzb2x2ZXMgd2l0aGluIFRISVMgbm9kZVxuICAgKiB0aHJvdWdoIGF0dGVtcHRTdW1tYXJ5LCBlcnJvcnM6c3RhZ2VFeGVjdXRpb25FcnJvciBvciBhdHRlbXB0c0Ryb3BwZWQuIFF1YWxpdHkgbWFya3MgYXJlIHJlYWQtdGltZSByZWNvcmRlciB3b3JrLlxuICAgKiBNYXJrcyByZXRhaW4gbm8gZXJyb3IgdGV4dCwgdmFsdWVzLCB0YXJnZXRzIG9yIGlkZW1wb3RlbmN5IGtleXM7IG9taXR0ZWQgcHJvb2YgaXMgZGlzY2xvc2VkIGFzIG5vdC1jb2xsZWN0ZWQuXG4gICAqL1xuICBhdHRlbnRpb24/OiByZWFkb25seSBBdHRlbnRpb25bXTtcbiAgbmV4dD86IFN0YWdlU25hcHNob3Q7XG4gIGNoaWxkcmVuPzogU3RhZ2VTbmFwc2hvdFtdO1xufTtcbiJdfQ==
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWVUeXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2ZyYW1lVHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZnJhbWVUeXBlcy50cyDigJQgdGhlIHR5cGVzIG9mIHRoZSBlbmdpbmUncyBmcmFtZSAoTDQpOiB3aGF0IG9uZSBzdGFnZSBpbnNpZGUgYSBydW4gcmVwb3J0cy5cbiAqXG4gKiBJdHMgc25hcHNob3QgKGBTdGFnZVNuYXBzaG90YCwgb25lIG5vZGUgb2YgdGhlIGV4ZWN1dGlvbiB0cmVlKSwgaXRzIGZsb3cgbWVzc2FnZXNcbiAqIChgRmxvd01lc3NhZ2VgLCBgRmxvd0NvbnRyb2xUeXBlYCkgYW5kIHRoZSB0d28gcmV0ZW50aW9uIGRpYWxzIHRoYXQgc2hhcGUgd2hhdCB0aGUgc25hcHNob3RcbiAqIGtlZXBzIChgUmVhZFRyYWNraW5nTW9kZWAsIGBXcml0ZVRyYWNraW5nTW9kZWAsIG92ZXIgYGNhcHR1cmUvYCdzIGBSZXRlbnRpb25Qb2xpY3lgKS4gVGhleSBsaXZlZFxuICogaW4gdGhlIHJlY29yZCdzIGB0eXBlcy50c2AgdW50aWwgQzY7IHRoZSByZWNvcmQgbmFtZXMgbm90aGluZyBvdXRzaWRlIGl0c2VsZiBub3dcbiAqIChgUkVDT1JEX0ZJTEVTYCwgc2NyaXB0cy9sYXllcmluZy5jb25maWcuY2pzKSwgc28gdGhleSBzaXQgYmVzaWRlIHRoZSBmcmFtZSB0aGF0IHdyaXRlcyB0aGVtLlxuICpcbiAqIEEgcmV0cmllZCBzdGFnZSdzIG5vZGUgYWxzbyBjYXJyaWVzIGl0cyBhdHRlbXB0cyAoYGF0dGVtcHRzYCwgYGF0dGVtcHRTdW1tYXJ5YCDigJQgdGhlIGF0dGVtcHQgbGVhZidzIHR5cGVzLCBMMCkuXG4gKlxuICogQSBgU3RhZ2VTbmFwc2hvdGAgaXMgYW4gYEV4ZWN1dGlvblRyZWVgIChgdHlwZXMudHNgKSwgdGhlIHNoYXBlIHRoZSByZWNvcmQncyByZWFkZXJzIHdhbGs6XG4gKiBgY29tbWl0U3RvcHNgLCBgdGFnU3RvcHNgIGFuZCBga2V5c1JlYWRGcm9tRXhlY3V0aW9uVHJlZWAgdGFrZSBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRlbnRpb24gfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRSZWNvcmQsIEF0dGVtcHRTdW1tYXJ5LCBMYXRlV3JpdGUgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5IH0gZnJvbSAnLi4vY2FwdHVyZS9wb2xpY2llcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZVJlYWRDb3VudHMgfSBmcm9tICcuLi9jYXB0dXJlL3NvdXJjZVJlYWRDb3VudHMuanMnO1xuXG4vLyDilIDilIAgRmxvdyBDb250cm9sIE5hcnJhdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFR5cGVzIG9mIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMgY2FwdHVyZWQgYnkgdGhlIGV4ZWN1dGlvbiBlbmdpbmUuICovXG5leHBvcnQgdHlwZSBGbG93Q29udHJvbFR5cGUgPSAnbmV4dCcgfCAnYnJhbmNoJyB8ICdjaGlsZHJlbicgfCAnc2VsZWN0ZWQnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnO1xuXG4vKiogQSBzaW5nbGUgZmxvdyBjb250cm9sIG5hcnJhdGl2ZSBlbnRyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd01lc3NhZ2Uge1xuICB0eXBlOiBGbG93Q29udHJvbFR5cGU7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHJhdGlvbmFsZT86IHN0cmluZztcbiAgY291bnQ/OiBudW1iZXI7XG4gIGl0ZXJhdGlvbj86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgUmVhZCAvIFdyaXRlIFRyYWNraW5nICgjMTQsICMxM2MtQSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gVGhlIHBvbGljeSBmYW1pbHkgYW5kIG1hcmtlciBzaGFwZXMgYXJlIG93bmVkIGJ5IGBjYXB0dXJlL2AgKHNoYXJlZCB3aXRoXG4vLyB0aGUgZGVmZXJyZWQtb2JzZXJ2ZXIgY2FwdHVyZSB0aWVyKS5cblxuLyoqXG4gKiBQb2xpY3kgZm9yIGhvdyB0cmFja2VkIHJlYWRzIGFyZSByZWNvcmRlZCBpbnRvIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgLlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHJlYWQgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvXG4gKiAgIHRoZSBzdGFnZSdzIHJlYWQgdmlldy4gQnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgYmVoYXZpb3I7IHRoaXMgaXNcbiAqICAgd2hhdCBzbmFwc2hvdCBjb25zdW1lcnMgKGxlbnMsIGFnZW50Zm9vdHByaW50KSBzZWUgdG9kYXkuXG4gKiAtIGAnc3VtbWFyeSdgIOKAlCByZWFkcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9ICh0eXBlICsgc2l6ZVxuICogICBwcm94eSArIHNob3J0IHByZXZpZXcpIGluc3RlYWQgb2YgdGhlIGNsb25lZCB2YWx1ZS4gTygxKS1pc2ggcGVyIHJlYWQg4oCUXG4gKiAgIG5vIHZhbHVlIGNsb25lLCBubyBzZXJpYWxpemF0aW9uIG9mIGxhcmdlIG9iamVjdHMuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHJlYWRzIGFyZSBub3QgcmVjb3JkZWQgYXQgYWxsOyBgc3RhZ2VSZWFkc2AgaXMgYWJzZW50IGZyb20gdGhlXG4gKiAgIHNuYXBzaG90LiBaZXJvIHBlci1yZWFkIGNvc3QuIFZhbHVlcyBhcmUgc3RpbGwgcmVhZGFibGUsIGFuZCB0aGVcbiAqICAgYFNjb3BlUmVjb3JkZXIub25SZWFkYCBldmVudCBzdGlsbCBmaXJlcyAoaXQgcGFzc2VzIHRoZSBsaXZlIHJlZmVyZW5jZSBhbmRcbiAqICAgbmV2ZXIgY2xvbmVkKSDigJQgc28gbmFycmF0aXZlIG91dHB1dCBpcyBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS4gVGhlIHBvbGljeVxuICogICBzY29wZXMgT05MWSB0aGUgc25hcHNob3QncyBgc3RhZ2VSZWFkc2AgcGF5bG9hZC5cbiAqXG4gKiBTZXQgdmlhIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgKGJlZm9yZSBgcnVuKClgKS5cbiAqXG4gKiBBbGlhcyBvZiB0aGUgc2hhcmVkIHtAbGluayBSZXRlbnRpb25Qb2xpY3l9IGZhbWlseSAoIzEzYy1BKSDigJQga2VwdCBhcyB0aGVcbiAqIHNoaXBwZWQgcHVibGljIG5hbWUgZm9yIHRoZSByZWFkIGRpYWwuXG4gKi9cbmV4cG9ydCB0eXBlIFJlYWRUcmFja2luZ01vZGUgPSBSZXRlbnRpb25Qb2xpY3k7XG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgdHJhY2tlZCB3cml0ZXMgYXJlIHJlY29yZGVkIGludG8gYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgXG4gKiAoIzEzYy1BKSDigJQgdGhlIHNpYmxpbmcgb2Yge0BsaW5rIFJlYWRUcmFja2luZ01vZGV9LlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHdyaXRlIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50b1xuICogICB0aGUgc3RhZ2UncyB3cml0ZSB2aWV3LiBCeXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvci5cbiAqIC0gYCdzdW1tYXJ5J2Ag4oCUIHdyaXRlcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgV3JpdGVTdW1tYXJ5TWFya2VyfSBpbnN0ZWFkIG9mXG4gKiAgIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHdyaXRlcyBhcmUgbm90IHJlY29yZGVkIGF0IGFsbDsgYHN0YWdlV3JpdGVzYCBpcyBhYnNlbnQgZnJvbSB0aGVcbiAqICAgc25hcHNob3QuIFRoZSB3cml0ZXMgdGhlbXNlbHZlcyBzdGlsbCBjb21taXQgdG8gc2hhcmVkIHN0YXRlIGFuZCBzdGlsbFxuICogICBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cg4oCUIG9ubHkgdGhlIHBlci1zdGFnZSBzbmFwc2hvdCBib29ra2VlcGluZyAoYW5kXG4gKiAgIHRoZXJlZm9yZSB0aGUgY29tbWl0IG9ic2VydmVyJ3MgbXV0YXRpb25zIHBheWxvYWQpIGlzIGFmZmVjdGVkLiAoVGhlXG4gKiAgIGNvbW1pdCBsb2cncyBvd24gdmFsdWUgZW5jb2RpbmcgaGFzIGl0cyBvd24gbG9zc2xlc3MgZGlhbCDigJRcbiAqICAge0BsaW5rIENvbW1pdFZhbHVlc01vZGV9LCAjMTNjLUIuKVxuICpcbiAqIFNldCB2aWEgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyB3cml0ZVRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuIFNlZVxuICogYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nYCBmb3IgdGhlIGZ1bGwgb2JzZXJ2YWJsZS1jb25zZXF1ZW5jZVxuICogY29udHJhY3QgKG9uQ29tbWl0IHBheWxvYWQsIHJlZGFjdGlvbiBwcmVjZWRlbmNlLCB3aGF0IGlzIE9VVCBvZiBzY29wZSkuXG4gKi9cbmV4cG9ydCB0eXBlIFdyaXRlVHJhY2tpbmdNb2RlID0gUmV0ZW50aW9uUG9saWN5O1xuXG4vLyDilIDilIAgU3RhZ2UgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBTZXJpYWxpc2FibGUgcmVwcmVzZW50YXRpb24gb2YgYSBzdGFnZSdzIHN0YXRlIChmb3IgZGVidWdnaW5nIC8gdmlzdWFsaXNhdGlvbikuICovXG5leHBvcnQgdHlwZSBTdGFnZVNuYXBzaG90ID0ge1xuICBpZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleCAqL1xuICBydW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBzdGFnZSBkb2VzIChmcm9tIGJ1aWxkZXIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciDigJQgcHJlc2VudCB3aGVuIHRoaXMgc3RhZ2UgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50LiAqL1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIGlzRGVjaWRlcj86IGJvb2xlYW47XG4gIGlzRm9yaz86IGJvb2xlYW47XG4gIC8qKiBVc2VyLWxldmVsIHdyaXRlcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzKS5cbiAgICogIFNoYXBlIGRlcGVuZHMgb24ge0BsaW5rIFdyaXRlVHJhY2tpbmdNb2RlfTogY2xvbmVkIHZhbHVlcyB1bmRlciBgJ2Z1bGwnYFxuICAgKiAgKGRlZmF1bHQpLCB7QGxpbmsgV3JpdGVTdW1tYXJ5TWFya2VyfXMgdW5kZXIgYCdzdW1tYXJ5J2AsIGFic2VudCB1bmRlclxuICAgKiAgYCdvZmYnYC4gUmVkYWN0ZWQgd3JpdGVzIHNob3cgYCdbUkVEQUNURURdJ2AgcmVnYXJkbGVzcyBvZiBtb2RlLiAqL1xuICBzdGFnZVdyaXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogVXNlci1sZXZlbCByZWFkcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzIGF0IHJlYWRcbiAgICogIHRpbWUpLiBTaGFwZSBkZXBlbmRzIG9uIHtAbGluayBSZWFkVHJhY2tpbmdNb2RlfTogY2xvbmVkIHZhbHVlcyB1bmRlclxuICAgKiAgYCdmdWxsJ2AgKGRlZmF1bHQpLCB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9cyB1bmRlciBgJ3N1bW1hcnknYCwgYWJzZW50XG4gICAqICB1bmRlciBgJ29mZidgLiAqL1xuICBzdGFnZVJlYWRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBOYXRpdmUgc291cmNlLXJlYWQgdG90YWxzIGFjcm9zcyBhbGwgYXR0ZW1wdHMsIG9ubHkgd2l0aCBhbiBvd25lZCBzb3VyY2UgYm9vay4gTm8gdmFsdWVzIG9yIG5hbWVzLiAqL1xuICByZWFkU291cmNlQ291bnRzPzogU291cmNlUmVhZENvdW50cztcbiAgLyoqIE51bWJlciBvZiBuYXRpdmUgc3RhZ2UtZnVuY3Rpb24gZW50cmllcywgaW5kZXBlbmRlbnQgb2YgcmVhZCByZXRlbnRpb24gYW5kIG93bmVyc2hpcC1saXN0IGJ1ZGdldHMuICovXG4gIHJlYWRTb3VyY2VJbnZvY2F0aW9ucz86IG51bWJlcjtcbiAgbG9nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVycm9yczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIG1ldHJpY3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBldmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZsb3dNZXNzYWdlcz86IEZsb3dNZXNzYWdlW107XG4gIC8qKlxuICAgKiBFdmVyeSBhdHRlbXB0IG9mIHRoaXMgZXhlY3V0aW9uLCBpbiBvcmRlciDigJQgd2hlbiBpdCBzdGFydGVkLCBob3cgbG9uZyBpdCB0b29rLCBob3cgaXQgZW5kZWQsIGFuZCB0aGVcbiAgICogcmV0cnktb3Itc3RvcCBkZWNpc2lvbiB0aGF0IGZvbGxvd2VkIChgQXR0ZW1wdFJlY29yZGApOiB0aGUgc3RhZ2UncyBvd24gdW5kZXIgaXRzIHJldHJ5IHBvbGljeSwgYSBgdGltZW91dE1zYFxuICAgKiBvciBhIHJ1biBkZWFkbGluZSAoMTAuMSwgYGtpbmQ6ICdzdGFnZSdgKSwgYW5kIHRob3NlIG9mIHRoZSBjYWxscyBpdCBtYWRlIHRocm91Z2ggYHNjb3BlLiRjYWxsYCBhbmQgdGhlXG4gICAqIG91dHNpZGUgYXR0ZW1wdHMgaXQgcmVwb3J0ZWQgdGhyb3VnaCBgb2JzZXJ2ZWQoKWAgKFAyLCBga2luZDogJ2NhbGwnYCAvIGAnb2JzZXJ2ZWQnYCwgdGhlIGZpcnN0IDEwMDAg4oCUXG4gICAqIGBTdGFnZUNvbnRleHQgwrcgTUFYX0NBTExfUkVDT1JEU2ApLiBBYnNlbnQgd2hlbiB0aGVyZSBhcmUgbm9uZS4gVGhlIGNvbW1pdCBsb2cgbmV2ZXIgY2FycmllcyBhdHRlbXB0czogYVxuICAgKiByZXRyaWVkIHN0YWdlIGlzIHN0aWxsIE9ORSBidW5kbGUuXG4gICAqL1xuICBhdHRlbXB0cz86IHJlYWRvbmx5IEF0dGVtcHRSZWNvcmRbXTtcbiAgLyoqXG4gICAqIENhbGwgYW5kIG9ic2VydmVkIGF0dGVtcHQgcmVjb3JkcyB0aGlzIGV4ZWN1dGlvbiBtYWRlIHBhc3QgdGhlIGZpcnN0IDEwMDAg4oCUIGNvdW50ZWQsIG5vdCBrZXB0IChlYWNoIHN0aWxsXG4gICAqIGZpcmVkIGBvbkF0dGVtcHRgKS4gQWJzZW50IHdoZW4gbm9uZSB3ZXJlIGRyb3BwZWQuXG4gICAqL1xuICBhdHRlbXB0c0Ryb3BwZWQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgc2VyaWVzIGF0IGEgZ2xhbmNlIOKAlCBjb3VudHMgcGVyIG91dGNvbWUsIGFuZCBob3cgaXQgZW5kZWQuIFN0YW1wZWQgd2hlbiB0aGUgc2VyaWVzIGVuZHM6IGFic2VudCB3aGlsZSBpdFxuICAgKiBpcyBzdGlsbCBydW5uaW5nIChhIHNuYXBzaG90IHRha2VuIG1pZC1zdGFnZSkgYW5kIHdpdGhvdXQgYSBwb2xpY3kuXG4gICAqL1xuICBhdHRlbXB0U3VtbWFyeT86IEF0dGVtcHRTdW1tYXJ5O1xuICAvKipcbiAgICogV3JpdGVzIChhbmQgZW1pdHMpIGFuIGF0dGVtcHQgdHJpZWQgQUZURVIgaXQgaGFkIGVuZGVkIOKAlCB0aW1lZCBvdXQsIGFib3J0ZWQgb3IgZmFpbGVkIOKAlCBpbiB0aGUgb3JkZXIgdGhleSBjYW1lXG4gICAqIChQMWIpLiBFYWNoIHdhcyBkcm9wcGVkIGF0IHRoZSBzY29wZSwgc28gbm9uZSByZWFjaGVkIHRoZSBzdGFnZSdzIGJ1ZmZlciwgaXRzIGNvbW1pdCBvciBhIHJlY29yZGVyOyB0aGlzIGlzXG4gICAqIHRoZSByZWNvcmQgdGhhdCB0aGV5IHdlcmUgdHJpZWQg4oCUIHRoZSBmaXJzdCAxMDAgKGBNQVhfTEFURV9XUklURVNgKS4gQW4gYWJhbmRvbmVkIGZ1bmN0aW9uIGNhbiBrZWVwIHJ1bm5pbmdcbiAgICogYWZ0ZXIgdGhlIHJ1biBlbmRlZCwgc28gdGhlIGxpc3QgY2FuIGdyb3cgYWZ0ZXIgYSBzbmFwc2hvdCB3YXMgdGFrZW4uIE5hbWVzIG9ubHksIG5ldmVyIHZhbHVlcy4gQWJzZW50IHdoZW5cbiAgICogdGhlcmUgd2VyZSBub25lLlxuICAgKi9cbiAgbGF0ZVdyaXRlcz86IHJlYWRvbmx5IExhdGVXcml0ZVtdO1xuICAvKipcbiAgICogRml4ZWQtcmVhc29uIG1hcmtzIGNvbGxlY3RlZCBhcyB0aGlzIGV4ZWN1dGlvbiBydW5zLiBBYnNlbnQgd2hlbiBubyBmYWN0IG5lZWRzIGF0dGVudGlvbi5cbiAgICogQXR0ZW1wdCBldmlkZW5jZSB1c2VzIGNhbm9uaWNhbCBGb290dHJhY2UgYXR0ZW1wdCBJRHMuIFN1bW1hcnktb25seSBhbmQgc3RhZ2UtZXJyb3IgcHJvb2YgcmVzb2x2ZXMgd2l0aGluIFRISVMgbm9kZVxuICAgKiB0aHJvdWdoIGF0dGVtcHRTdW1tYXJ5LCBlcnJvcnM6c3RhZ2VFeGVjdXRpb25FcnJvciBvciBhdHRlbXB0c0Ryb3BwZWQuIFF1YWxpdHkgbWFya3MgYXJlIHJlYWQtdGltZSByZWNvcmRlciB3b3JrLlxuICAgKiBNYXJrcyByZXRhaW4gbm8gZXJyb3IgdGV4dCwgdmFsdWVzLCB0YXJnZXRzIG9yIGlkZW1wb3RlbmN5IGtleXM7IG9taXR0ZWQgcHJvb2YgaXMgZGlzY2xvc2VkIGFzIG5vdC1jb2xsZWN0ZWQuXG4gICAqL1xuICBhdHRlbnRpb24/OiByZWFkb25seSBBdHRlbnRpb25bXTtcbiAgbmV4dD86IFN0YWdlU25hcHNob3Q7XG4gIGNoaWxkcmVuPzogU3RhZ2VTbmFwc2hvdFtdO1xufTtcbiJdfQ==
@@ -0,0 +1,14 @@
1
+ import type { IndexedLimits, IndexedRecordFileOptions, IndexedRecordFileReason } from './indexedTypes.js';
2
+ export declare class IndexedRefusal extends Error {
3
+ readonly reason: IndexedRecordFileReason;
4
+ constructor(reason: IndexedRecordFileReason);
5
+ }
6
+ /** An index key, not a source-ID or record codec. Canonical record admission remains in Foottrace. */
7
+ export declare function indexedAddress(value: unknown): string;
8
+ export declare function indexedLimits(options: IndexedRecordFileOptions): IndexedLimits;
9
+ export declare function refused(error: unknown): {
10
+ readonly status: 'unknown';
11
+ readonly reason: IndexedRecordFileReason;
12
+ };
13
+ /** Filesystem errors and rejected bytes are never interpolated into a served reason. */
14
+ export declare function checkSignal(signal: AbortSignal): void;
@@ -0,0 +1,77 @@
1
+ import { ownData } from '../capture/noteShape.js';
2
+ export class IndexedRefusal extends Error {
3
+ reason;
4
+ constructor(reason) {
5
+ super('indexed record file: evidence unavailable');
6
+ this.reason = reason;
7
+ }
8
+ }
9
+ /** An index key, not a source-ID or record codec. Canonical record admission remains in Foottrace. */
10
+ export function indexedAddress(value) {
11
+ const run = ownData(value, 'logRunId');
12
+ const path = ownData(value, 'drillPath');
13
+ if (typeof run !== 'string' || !run.length || run.length > 2048 || !Array.isArray(path))
14
+ throw new IndexedRefusal('invalid-data');
15
+ const length = Object.getOwnPropertyDescriptor(path, 'length')?.value;
16
+ if (Object.getPrototypeOf(path) !== Array.prototype || !Number.isSafeInteger(length) || length > 64)
17
+ throw new IndexedRefusal('invalid-data');
18
+ const segments = [];
19
+ for (let index = 0; index < length; index++) {
20
+ const segment = Object.getOwnPropertyDescriptor(path, String(index))?.value;
21
+ if (typeof segment !== 'string' || !segment.length || segment.length > 2048)
22
+ throw new IndexedRefusal('invalid-data');
23
+ segments.push(segment);
24
+ }
25
+ return JSON.stringify([run, segments]);
26
+ }
27
+ function limit(options, name, fallback, maximum) {
28
+ const configured = ownData(options, name);
29
+ const value = configured === undefined ? fallback : configured;
30
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1 || value > maximum)
31
+ throw new TypeError('openIndexedRecordFile: invalid host limits');
32
+ return value;
33
+ }
34
+ export function indexedLimits(options) {
35
+ if (!options || Object.getPrototypeOf(options) !== Object.prototype)
36
+ throw new TypeError('openIndexedRecordFile: explicit host authorization required');
37
+ for (const key of Reflect.ownKeys(options)) {
38
+ const descriptor = Object.getOwnPropertyDescriptor(options, key);
39
+ if (!descriptor || !Object.prototype.hasOwnProperty.call(descriptor, 'value'))
40
+ throw new TypeError('openIndexedRecordFile: options must be plain data');
41
+ if (typeof key !== 'string' ||
42
+ !['allowedScopes', 'maxBytes', 'maxEntryBytes', 'maxEntries', 'maxScopeBytes', 'timeoutMs', 'signal'].includes(key))
43
+ throw new TypeError('openIndexedRecordFile: unsupported host option');
44
+ }
45
+ const scopes = ownData(options, 'allowedScopes');
46
+ if (!Array.isArray(scopes) || Object.getPrototypeOf(scopes) !== Array.prototype || scopes.length > 256)
47
+ throw new TypeError('openIndexedRecordFile: explicit host authorization required');
48
+ const allowed = new Set();
49
+ try {
50
+ for (let index = 0; index < scopes.length; index++)
51
+ allowed.add(indexedAddress(Object.getOwnPropertyDescriptor(scopes, String(index))?.value));
52
+ }
53
+ catch {
54
+ throw new TypeError('openIndexedRecordFile: invalid authorized scope');
55
+ }
56
+ const signal = ownData(options, 'signal');
57
+ if (signal !== undefined && !(signal instanceof AbortSignal))
58
+ throw new TypeError('openIndexedRecordFile: invalid cancellation signal');
59
+ return {
60
+ allowed,
61
+ maxBytes: limit(options, 'maxBytes', 64 * 1024 * 1024, 256 * 1024 * 1024),
62
+ maxEntryBytes: limit(options, 'maxEntryBytes', 8 * 1024 * 1024, 8 * 1024 * 1024),
63
+ maxEntries: limit(options, 'maxEntries', 16384, 65536),
64
+ maxScopeBytes: limit(options, 'maxScopeBytes', 8 * 1024 * 1024, 64 * 1024 * 1024),
65
+ timeoutMs: limit(options, 'timeoutMs', 10000, 30000),
66
+ ...(signal && { signal }),
67
+ };
68
+ }
69
+ export function refused(error) {
70
+ return { status: 'unknown', reason: error instanceof IndexedRefusal ? error.reason : 'unavailable' };
71
+ }
72
+ /** Filesystem errors and rejected bytes are never interpolated into a served reason. */
73
+ export function checkSignal(signal) {
74
+ if (signal.aborted)
75
+ throw new IndexedRefusal('cancelled');
76
+ }
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZEFkbWlzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2lua3MvaW5kZXhlZEFkbWlzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbEQsTUFBTSxPQUFPLGNBQWUsU0FBUSxLQUFLO0lBQ2xCO0lBQXJCLFlBQXFCLE1BQStCO1FBQ2xELEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBRGhDLFdBQU0sR0FBTixNQUFNLENBQXlCO0lBRXBELENBQUM7Q0FDRjtBQUVELHNHQUFzRztBQUN0RyxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3JGLE1BQU0sSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7SUFDdEUsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxFQUFFO1FBQ2pHLE1BQU0sSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0MsTUFBTSxRQUFRLEdBQWEsRUFB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QUFDLEtBQWM7SUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssWUFBWSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO0FBQ3ZHLENBQUM7QUFFRCx3RkFBd0Y7QUFDeEYsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFtQjtJQUM3QyxJQUFJLE1BQU0sQ0FBQyxPQUFPO1FBQUUsTUFBTSxJQUFJLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgb3duRGF0YSB9IGZyb20gJy4uL2NhcHR1cmUvbm90ZVNoYXBlLmpzJztcbmltcG9ydCB0eXBlIHsgSW5kZXhlZExpbWl0cywgSW5kZXhlZFJlY29yZEZpbGVPcHRpb25zLCBJbmRleGVkUmVjb3JkRmlsZVJlYXNvbiB9IGZyb20gJy4vaW5kZXhlZFR5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIEluZGV4ZWRSZWZ1c2FsIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSByZWFzb246IEluZGV4ZWRSZWNvcmRGaWxlUmVhc29uKSB7XG4gICAgc3VwZXIoJ2luZGV4ZWQgcmVjb3JkIGZpbGU6IGV2aWRlbmNlIHVuYXZhaWxhYmxlJyk7XG4gIH1cbn1cblxuLyoqIEFuIGluZGV4IGtleSwgbm90IGEgc291cmNlLUlEIG9yIHJlY29yZCBjb2RlYy4gQ2Fub25pY2FsIHJlY29yZCBhZG1pc3Npb24gcmVtYWlucyBpbiBGb290dHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhlZEFkZHJlc3ModmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBydW4gPSBvd25EYXRhKHZhbHVlLCAnbG9nUnVuSWQnKTtcbiAgY29uc3QgcGF0aCA9IG93bkRhdGEodmFsdWUsICdkcmlsbFBhdGgnKTtcbiAgaWYgKHR5cGVvZiBydW4gIT09ICdzdHJpbmcnIHx8ICFydW4ubGVuZ3RoIHx8IHJ1bi5sZW5ndGggPiAyMDQ4IHx8ICFBcnJheS5pc0FycmF5KHBhdGgpKVxuICAgIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnaW52YWxpZC1kYXRhJyk7XG4gIGNvbnN0IGxlbmd0aCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocGF0aCwgJ2xlbmd0aCcpPy52YWx1ZTtcbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwYXRoKSAhPT0gQXJyYXkucHJvdG90eXBlIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihsZW5ndGgpIHx8IGxlbmd0aCA+IDY0KVxuICAgIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnaW52YWxpZC1kYXRhJyk7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3Qgc2VnbWVudCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocGF0aCwgU3RyaW5nKGluZGV4KSk/LnZhbHVlO1xuICAgIGlmICh0eXBlb2Ygc2VnbWVudCAhPT0gJ3N0cmluZycgfHwgIXNlZ21lbnQubGVuZ3RoIHx8IHNlZ21lbnQubGVuZ3RoID4gMjA0OClcbiAgICAgIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnaW52YWxpZC1kYXRhJyk7XG4gICAgc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW3J1biwgc2VnbWVudHNdKTtcbn1cblxuZnVuY3Rpb24gbGltaXQob3B0aW9uczogdW5rbm93biwgbmFtZTogc3RyaW5nLCBmYWxsYmFjazogbnVtYmVyLCBtYXhpbXVtOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBjb25maWd1cmVkID0gb3duRGF0YShvcHRpb25zLCBuYW1lKTtcbiAgY29uc3QgdmFsdWUgPSBjb25maWd1cmVkID09PSB1bmRlZmluZWQgPyBmYWxsYmFjayA6IGNvbmZpZ3VyZWQ7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPCAxIHx8IHZhbHVlID4gbWF4aW11bSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcGVuSW5kZXhlZFJlY29yZEZpbGU6IGludmFsaWQgaG9zdCBsaW1pdHMnKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhlZExpbWl0cyhvcHRpb25zOiBJbmRleGVkUmVjb3JkRmlsZU9wdGlvbnMpOiBJbmRleGVkTGltaXRzIHtcbiAgaWYgKCFvcHRpb25zIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvcHRpb25zKSAhPT0gT2JqZWN0LnByb3RvdHlwZSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcGVuSW5kZXhlZFJlY29yZEZpbGU6IGV4cGxpY2l0IGhvc3QgYXV0aG9yaXphdGlvbiByZXF1aXJlZCcpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMob3B0aW9ucykpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvcHRpb25zLCBrZXkpO1xuICAgIGlmICghZGVzY3JpcHRvciB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc2NyaXB0b3IsICd2YWx1ZScpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3BlbkluZGV4ZWRSZWNvcmRGaWxlOiBvcHRpb25zIG11c3QgYmUgcGxhaW4gZGF0YScpO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnIHx8XG4gICAgICAhWydhbGxvd2VkU2NvcGVzJywgJ21heEJ5dGVzJywgJ21heEVudHJ5Qnl0ZXMnLCAnbWF4RW50cmllcycsICdtYXhTY29wZUJ5dGVzJywgJ3RpbWVvdXRNcycsICdzaWduYWwnXS5pbmNsdWRlcyhcbiAgICAgICAga2V5LFxuICAgICAgKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wZW5JbmRleGVkUmVjb3JkRmlsZTogdW5zdXBwb3J0ZWQgaG9zdCBvcHRpb24nKTtcbiAgfVxuICBjb25zdCBzY29wZXMgPSBvd25EYXRhKG9wdGlvbnMsICdhbGxvd2VkU2NvcGVzJyk7XG4gIGlmICghQXJyYXkuaXNBcnJheShzY29wZXMpIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihzY29wZXMpICE9PSBBcnJheS5wcm90b3R5cGUgfHwgc2NvcGVzLmxlbmd0aCA+IDI1NilcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcGVuSW5kZXhlZFJlY29yZEZpbGU6IGV4cGxpY2l0IGhvc3QgYXV0aG9yaXphdGlvbiByZXF1aXJlZCcpO1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHRyeSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjb3Blcy5sZW5ndGg7IGluZGV4KyspXG4gICAgICBhbGxvd2VkLmFkZChpbmRleGVkQWRkcmVzcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNjb3BlcywgU3RyaW5nKGluZGV4KSk/LnZhbHVlKSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wZW5JbmRleGVkUmVjb3JkRmlsZTogaW52YWxpZCBhdXRob3JpemVkIHNjb3BlJyk7XG4gIH1cbiAgY29uc3Qgc2lnbmFsID0gb3duRGF0YShvcHRpb25zLCAnc2lnbmFsJykgYXMgQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG4gIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCAmJiAhKHNpZ25hbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcGVuSW5kZXhlZFJlY29yZEZpbGU6IGludmFsaWQgY2FuY2VsbGF0aW9uIHNpZ25hbCcpO1xuICByZXR1cm4ge1xuICAgIGFsbG93ZWQsXG4gICAgbWF4Qnl0ZXM6IGxpbWl0KG9wdGlvbnMsICdtYXhCeXRlcycsIDY0ICogMTAyNCAqIDEwMjQsIDI1NiAqIDEwMjQgKiAxMDI0KSxcbiAgICBtYXhFbnRyeUJ5dGVzOiBsaW1pdChvcHRpb25zLCAnbWF4RW50cnlCeXRlcycsIDggKiAxMDI0ICogMTAyNCwgOCAqIDEwMjQgKiAxMDI0KSxcbiAgICBtYXhFbnRyaWVzOiBsaW1pdChvcHRpb25zLCAnbWF4RW50cmllcycsIDE2Mzg0LCA2NTUzNiksXG4gICAgbWF4U2NvcGVCeXRlczogbGltaXQob3B0aW9ucywgJ21heFNjb3BlQnl0ZXMnLCA4ICogMTAyNCAqIDEwMjQsIDY0ICogMTAyNCAqIDEwMjQpLFxuICAgIHRpbWVvdXRNczogbGltaXQob3B0aW9ucywgJ3RpbWVvdXRNcycsIDEwMDAwLCAzMDAwMCksXG4gICAgLi4uKHNpZ25hbCAmJiB7IHNpZ25hbCB9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZnVzZWQoZXJyb3I6IHVua25vd24pOiB7IHJlYWRvbmx5IHN0YXR1czogJ3Vua25vd24nOyByZWFkb25seSByZWFzb246IEluZGV4ZWRSZWNvcmRGaWxlUmVhc29uIH0ge1xuICByZXR1cm4geyBzdGF0dXM6ICd1bmtub3duJywgcmVhc29uOiBlcnJvciBpbnN0YW5jZW9mIEluZGV4ZWRSZWZ1c2FsID8gZXJyb3IucmVhc29uIDogJ3VuYXZhaWxhYmxlJyB9O1xufVxuXG4vKiogRmlsZXN5c3RlbSBlcnJvcnMgYW5kIHJlamVjdGVkIGJ5dGVzIGFyZSBuZXZlciBpbnRlcnBvbGF0ZWQgaW50byBhIHNlcnZlZCByZWFzb24uICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTaWduYWwoc2lnbmFsOiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnY2FuY2VsbGVkJyk7XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import type { IndexedRecordUnknown } from './indexedTypes.js';
2
+ /** The path is a host capability, never a path constructed from a stored run or requested node. */
3
+ export declare function openIndexedDescriptor(path: string): number;
4
+ export declare function fileIdentity(fd: number): {
5
+ readonly key: string;
6
+ readonly size: number;
7
+ };
8
+ export declare function assertIdentity(fd: number, key: string): void;
9
+ export declare function digest(bytes: Uint8Array): string;
10
+ /** Positional bytes only; exact short-read accounting is retained even when a later check refuses them. */
11
+ export declare function readBytes(fd: number, offset: number, bytes: number, signal: AbortSignal, count: (bytes: number) => void, submitted?: () => void): Promise<Uint8Array>;
12
+ export declare function closeDescriptor(fd: number): Promise<void>;
13
+ /** A timeout bounds the wait, never frees an unfinished operation's file/slot. */
14
+ export declare function boundedIndexedWork<T>(work: (signal: AbortSignal) => Promise<T>, timeoutMs: number, signal: AbortSignal | undefined, settled: () => void): Promise<T | IndexedRecordUnknown>;
@@ -0,0 +1,96 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { close, constants, fstatSync, openSync, read } from 'node:fs';
3
+ import { getuid } from 'node:process';
4
+ import { checkSignal, IndexedRefusal } from './indexedAdmission.js';
5
+ /** The path is a host capability, never a path constructed from a stored run or requested node. */
6
+ export function openIndexedDescriptor(path) {
7
+ if (typeof path !== 'string' || !path.length)
8
+ throw new TypeError('openIndexedRecordFile: invalid path');
9
+ return openSync(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0));
10
+ }
11
+ export function fileIdentity(fd) {
12
+ const stat = fstatSync(fd);
13
+ const uid = typeof getuid === 'function' ? getuid() : undefined;
14
+ if (!stat.isFile() ||
15
+ stat.nlink !== 1 ||
16
+ (uid !== undefined && (stat.uid !== uid || (stat.mode & 0o022) !== 0)) ||
17
+ !Number.isSafeInteger(stat.size) ||
18
+ stat.size < 0)
19
+ throw new IndexedRefusal('unavailable');
20
+ return { key: JSON.stringify([stat.dev, stat.ino, stat.size, stat.mtimeMs, stat.ctimeMs]), size: stat.size };
21
+ }
22
+ export function assertIdentity(fd, key) {
23
+ if (fileIdentity(fd).key !== key)
24
+ throw new IndexedRefusal('stale');
25
+ }
26
+ export function digest(bytes) {
27
+ return createHash('sha256').update(bytes).digest('hex');
28
+ }
29
+ /** Positional bytes only; exact short-read accounting is retained even when a later check refuses them. */
30
+ export async function readBytes(fd, offset, bytes, signal, count, submitted) {
31
+ const buffer = new Uint8Array(bytes);
32
+ let filled = 0;
33
+ while (filled < bytes) {
34
+ checkSignal(signal);
35
+ const length = await new Promise((resolve, reject) => {
36
+ submitted?.();
37
+ read(fd, buffer, filled, bytes - filled, offset + filled, (error, amount) => {
38
+ if (error)
39
+ reject(error);
40
+ else
41
+ resolve(amount);
42
+ });
43
+ });
44
+ count(length);
45
+ if (!length)
46
+ throw new IndexedRefusal('stale');
47
+ filled += length;
48
+ }
49
+ checkSignal(signal);
50
+ return buffer;
51
+ }
52
+ export function closeDescriptor(fd) {
53
+ return new Promise((resolve) => close(fd, () => resolve()));
54
+ }
55
+ /** A timeout bounds the wait, never frees an unfinished operation's file/slot. */
56
+ export async function boundedIndexedWork(work, timeoutMs, signal, settled) {
57
+ if (signal?.aborted) {
58
+ settled();
59
+ return { status: 'unknown', reason: 'cancelled' };
60
+ }
61
+ const controller = new AbortController();
62
+ const deadline = performance.now() + timeoutMs;
63
+ let interrupt = () => undefined;
64
+ const interrupted = new Promise((resolve) => (interrupt = resolve));
65
+ const cancel = () => {
66
+ controller.abort();
67
+ interrupt({ status: 'unknown', reason: 'cancelled' });
68
+ };
69
+ signal?.addEventListener('abort', cancel, { once: true });
70
+ const timer = setTimeout(() => {
71
+ controller.abort();
72
+ interrupt({ status: 'unknown', reason: 'timeout' });
73
+ }, timeoutMs);
74
+ const running = Promise.resolve()
75
+ .then(() => work(controller.signal))
76
+ .then((value) => {
77
+ if (performance.now() < deadline)
78
+ return value;
79
+ controller.abort();
80
+ return { status: 'unknown', reason: 'timeout' };
81
+ }, (error) => {
82
+ if (performance.now() < deadline)
83
+ throw error;
84
+ controller.abort();
85
+ return { status: 'unknown', reason: 'timeout' };
86
+ });
87
+ running.then(settled, settled);
88
+ try {
89
+ return await Promise.race([running, interrupted]);
90
+ }
91
+ finally {
92
+ clearTimeout(timer);
93
+ signal?.removeEventListener('abort', cancel);
94
+ }
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZElPLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zaW5rcy9pbmRleGVkSU8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHcEUsbUdBQW1HO0FBQ25HLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUFZO0lBQ2hELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDekcsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hHLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEVBQVU7SUFDckMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sR0FBRyxHQUFHLE9BQU8sTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRSxJQUNFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNkLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQztRQUNoQixDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksQ0FB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QyxLQUFLLEVBQUUsQ0FBQztRQUNuQixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFXLENBQUM7SUFDM0QsQ0FBQyxFQUNELENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDakIsSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUTtZQUFFLE1BQU0sS0FBSyxDQUFDO1FBQzlDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFXLENBQUM7SUFDM0QsQ0FBQyxDQUNGLENBQUM7SUFDSixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7WUFBUyxDQUFDO1FBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0MsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY2xvc2UsIGNvbnN0YW50cywgZnN0YXRTeW5jLCBvcGVuU3luYywgcmVhZCB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZ2V0dWlkIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHsgY2hlY2tTaWduYWwsIEluZGV4ZWRSZWZ1c2FsIH0gZnJvbSAnLi9pbmRleGVkQWRtaXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSW5kZXhlZFJlY29yZFVua25vd24gfSBmcm9tICcuL2luZGV4ZWRUeXBlcy5qcyc7XG5cbi8qKiBUaGUgcGF0aCBpcyBhIGhvc3QgY2FwYWJpbGl0eSwgbmV2ZXIgYSBwYXRoIGNvbnN0cnVjdGVkIGZyb20gYSBzdG9yZWQgcnVuIG9yIHJlcXVlc3RlZCBub2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZW5JbmRleGVkRGVzY3JpcHRvcihwYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnIHx8ICFwYXRoLmxlbmd0aCkgdGhyb3cgbmV3IFR5cGVFcnJvcignb3BlbkluZGV4ZWRSZWNvcmRGaWxlOiBpbnZhbGlkIHBhdGgnKTtcbiAgcmV0dXJuIG9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1JET05MWSB8IChjb25zdGFudHMuT19OT0ZPTExPVyA/PyAwKSB8IChjb25zdGFudHMuT19OT05CTE9DSyA/PyAwKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxlSWRlbnRpdHkoZmQ6IG51bWJlcik6IHsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IHNpemU6IG51bWJlciB9IHtcbiAgY29uc3Qgc3RhdCA9IGZzdGF0U3luYyhmZCk7XG4gIGNvbnN0IHVpZCA9IHR5cGVvZiBnZXR1aWQgPT09ICdmdW5jdGlvbicgPyBnZXR1aWQoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKFxuICAgICFzdGF0LmlzRmlsZSgpIHx8XG4gICAgc3RhdC5ubGluayAhPT0gMSB8fFxuICAgICh1aWQgIT09IHVuZGVmaW5lZCAmJiAoc3RhdC51aWQgIT09IHVpZCB8fCAoc3RhdC5tb2RlICYgMG8wMjIpICE9PSAwKSkgfHxcbiAgICAhTnVtYmVyLmlzU2FmZUludGVnZXIoc3RhdC5zaXplKSB8fFxuICAgIHN0YXQuc2l6ZSA8IDBcbiAgKVxuICAgIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgndW5hdmFpbGFibGUnKTtcbiAgcmV0dXJuIHsga2V5OiBKU09OLnN0cmluZ2lmeShbc3RhdC5kZXYsIHN0YXQuaW5vLCBzdGF0LnNpemUsIHN0YXQubXRpbWVNcywgc3RhdC5jdGltZU1zXSksIHNpemU6IHN0YXQuc2l6ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SWRlbnRpdHkoZmQ6IG51bWJlciwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGZpbGVJZGVudGl0eShmZCkua2V5ICE9PSBrZXkpIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnc3RhbGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZ2VzdChieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYnl0ZXMpLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbi8qKiBQb3NpdGlvbmFsIGJ5dGVzIG9ubHk7IGV4YWN0IHNob3J0LXJlYWQgYWNjb3VudGluZyBpcyByZXRhaW5lZCBldmVuIHdoZW4gYSBsYXRlciBjaGVjayByZWZ1c2VzIHRoZW0uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEJ5dGVzKFxuICBmZDogbnVtYmVyLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgYnl0ZXM6IG51bWJlcixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgY291bnQ6IChieXRlczogbnVtYmVyKSA9PiB2b2lkLFxuICBzdWJtaXR0ZWQ/OiAoKSA9PiB2b2lkLFxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgbGV0IGZpbGxlZCA9IDA7XG4gIHdoaWxlIChmaWxsZWQgPCBieXRlcykge1xuICAgIGNoZWNrU2lnbmFsKHNpZ25hbCk7XG4gICAgY29uc3QgbGVuZ3RoID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzdWJtaXR0ZWQ/LigpO1xuICAgICAgcmVhZChmZCwgYnVmZmVyLCBmaWxsZWQsIGJ5dGVzIC0gZmlsbGVkLCBvZmZzZXQgKyBmaWxsZWQsIChlcnJvciwgYW1vdW50KSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgZWxzZSByZXNvbHZlKGFtb3VudCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb3VudChsZW5ndGgpO1xuICAgIGlmICghbGVuZ3RoKSB0aHJvdyBuZXcgSW5kZXhlZFJlZnVzYWwoJ3N0YWxlJyk7XG4gICAgZmlsbGVkICs9IGxlbmd0aDtcbiAgfVxuICBjaGVja1NpZ25hbChzaWduYWwpO1xuICByZXR1cm4gYnVmZmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VEZXNjcmlwdG9yKGZkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBjbG9zZShmZCwgKCkgPT4gcmVzb2x2ZSgpKSk7XG59XG5cbi8qKiBBIHRpbWVvdXQgYm91bmRzIHRoZSB3YWl0LCBuZXZlciBmcmVlcyBhbiB1bmZpbmlzaGVkIG9wZXJhdGlvbidzIGZpbGUvc2xvdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBib3VuZGVkSW5kZXhlZFdvcms8VD4oXG4gIHdvcms6IChzaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICB0aW1lb3V0TXM6IG51bWJlcixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgc2V0dGxlZDogKCkgPT4gdm9pZCxcbik6IFByb21pc2U8VCB8IEluZGV4ZWRSZWNvcmRVbmtub3duPiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHtcbiAgICBzZXR0bGVkKCk7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ2NhbmNlbGxlZCcgfTtcbiAgfVxuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBkZWFkbGluZSA9IHBlcmZvcm1hbmNlLm5vdygpICsgdGltZW91dE1zO1xuICBsZXQgaW50ZXJydXB0OiAocmVhc29uOiBJbmRleGVkUmVjb3JkVW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgY29uc3QgaW50ZXJydXB0ZWQgPSBuZXcgUHJvbWlzZTxJbmRleGVkUmVjb3JkVW5rbm93bj4oKHJlc29sdmUpID0+IChpbnRlcnJ1cHQgPSByZXNvbHZlKSk7XG4gIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgaW50ZXJydXB0KHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ2NhbmNlbGxlZCcgfSk7XG4gIH07XG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjYW5jZWwsIHsgb25jZTogdHJ1ZSB9KTtcbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgaW50ZXJydXB0KHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ3RpbWVvdXQnIH0pO1xuICB9LCB0aW1lb3V0TXMpO1xuICBjb25zdCBydW5uaW5nID0gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAudGhlbigoKSA9PiB3b3JrKGNvbnRyb2xsZXIuc2lnbmFsKSlcbiAgICAudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAocGVyZm9ybWFuY2Uubm93KCkgPCBkZWFkbGluZSkgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogJ3Vua25vd24nLCByZWFzb246ICd0aW1lb3V0JyB9IGFzIGNvbnN0O1xuICAgICAgfSxcbiAgICAgIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAocGVyZm9ybWFuY2Uubm93KCkgPCBkZWFkbGluZSkgdGhyb3cgZXJyb3I7XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAndW5rbm93bicsIHJlYXNvbjogJ3RpbWVvdXQnIH0gYXMgY29uc3Q7XG4gICAgICB9LFxuICAgICk7XG4gIHJ1bm5pbmcudGhlbihzZXR0bGVkLCBzZXR0bGVkKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtydW5uaW5nLCBpbnRlcnJ1cHRlZF0pO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGNhbmNlbCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import type { IndexedRecordFileOptions, IndexedRecordFileResult } from './indexedTypes.js';
2
+ /** Explicit bounded whole-file preparation, followed by authorized positional scope reads from that immutable file. */
3
+ export declare function openIndexedRecordFile(path: string, options: IndexedRecordFileOptions): Promise<IndexedRecordFileResult>;
@@ -0,0 +1,120 @@
1
+ import { ownData } from '../capture/noteShape.js';
2
+ import { checkSignal, indexedAddress, indexedLimits, IndexedRefusal, refused } from './indexedAdmission.js';
3
+ import { assertIdentity, boundedIndexedWork, closeDescriptor, digest, fileIdentity, openIndexedDescriptor, readBytes, } from './indexedIO.js';
4
+ import { scanIndexedFile } from './indexedScan.js';
5
+ /** Explicit bounded whole-file preparation, followed by authorized positional scope reads from that immutable file. */
6
+ export async function openIndexedRecordFile(path, options) {
7
+ const limits = indexedLimits(options);
8
+ if (limits.signal?.aborted)
9
+ return { status: 'unknown', reason: 'cancelled' };
10
+ let fd;
11
+ try {
12
+ fd = openIndexedDescriptor(path);
13
+ }
14
+ catch {
15
+ return { status: 'unknown', reason: 'unavailable' };
16
+ }
17
+ const stats = { preparationBytes: 0, scopeBytes: 0, readCalls: 0 };
18
+ let prepared = false;
19
+ let abandoned = false;
20
+ let running = false;
21
+ let closePromise;
22
+ const release = () => (closePromise ??= closeDescriptor(fd));
23
+ try {
24
+ const identity = fileIdentity(fd);
25
+ running = true;
26
+ const result = await boundedIndexedWork((signal) => scanIndexedFile(fd, identity, limits, signal, (bytes) => (stats.preparationBytes += bytes)), limits.timeoutMs, limits.signal, () => {
27
+ running = false;
28
+ if (abandoned)
29
+ release();
30
+ });
31
+ if (!(result instanceof Map))
32
+ return result;
33
+ prepared = true;
34
+ return { status: 'ready', reader: indexedReader(fd, identity.key, result, limits, stats) };
35
+ }
36
+ catch (error) {
37
+ return refused(error);
38
+ }
39
+ finally {
40
+ if (!prepared) {
41
+ abandoned = true;
42
+ if (!running)
43
+ await release();
44
+ }
45
+ }
46
+ }
47
+ function indexedReader(fd, identity, index, limits, stats) {
48
+ let closed = false;
49
+ let active = false;
50
+ let finishClose;
51
+ let closePromise;
52
+ const release = () => {
53
+ if (closed && !active)
54
+ closeDescriptor(fd).then(() => finishClose?.());
55
+ };
56
+ return Object.freeze({
57
+ get stats() {
58
+ return Object.freeze({ ...stats });
59
+ },
60
+ async readScope(address, context) {
61
+ try {
62
+ if (context !== undefined &&
63
+ (!context ||
64
+ Object.getPrototypeOf(context) !== Object.prototype ||
65
+ (Object.getOwnPropertyDescriptor(context, 'signal') !== undefined &&
66
+ !Object.prototype.hasOwnProperty.call(Object.getOwnPropertyDescriptor(context, 'signal'), 'value'))))
67
+ throw new IndexedRefusal('invalid-data');
68
+ const signal = context === undefined ? undefined : ownData(context, 'signal');
69
+ if (signal !== undefined && !(signal instanceof AbortSignal))
70
+ throw new IndexedRefusal('invalid-data');
71
+ if (signal?.aborted)
72
+ throw new IndexedRefusal('cancelled');
73
+ if (closed)
74
+ throw new IndexedRefusal('closed');
75
+ const key = indexedAddress(address);
76
+ if (!limits.allowed.has(key))
77
+ throw new IndexedRefusal('not-permitted');
78
+ if (active)
79
+ throw new IndexedRefusal('busy');
80
+ assertIdentity(fd, identity);
81
+ const ranges = index.get(key);
82
+ if (!ranges)
83
+ throw new IndexedRefusal('no-match');
84
+ active = true;
85
+ return await boundedIndexedWork((inner) => loadIndexedScope(fd, identity, key, ranges, inner, (bytes) => (stats.scopeBytes += bytes), () => stats.readCalls++), limits.timeoutMs, signal, () => {
86
+ active = false;
87
+ release();
88
+ });
89
+ }
90
+ catch (error) {
91
+ return refused(error);
92
+ }
93
+ },
94
+ close() {
95
+ if (!closePromise) {
96
+ closed = true;
97
+ closePromise = new Promise((resolve) => (finishClose = resolve));
98
+ release();
99
+ }
100
+ return closePromise;
101
+ },
102
+ });
103
+ }
104
+ async function loadIndexedScope(fd, identity, key, ranges, signal, count, submitted) {
105
+ const entries = [];
106
+ for (const range of ranges) {
107
+ checkSignal(signal);
108
+ const bytes = await readBytes(fd, range.offset, range.bytes, signal, count, submitted);
109
+ if (digest(bytes) !== range.digest)
110
+ throw new IndexedRefusal('stale');
111
+ const entry = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
112
+ if (indexedAddress(ownData(entry, 'address')) !== key)
113
+ throw new IndexedRefusal('invalid-data');
114
+ entries.push(entry);
115
+ }
116
+ assertIdentity(fd, identity);
117
+ checkSignal(signal);
118
+ return { status: 'loaded', entries, bytesRead: ranges.reduce((total, range) => total + range.bytes, 0) };
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZFJlY29yZEZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NpbmtzL2luZGV4ZWRSZWNvcmRGaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVHLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixNQUFNLEVBQ04sWUFBWSxFQUNaLHFCQUFxQixFQUNyQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFXbkQsdUhBQXVIO0FBQ3ZILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLElBQVksRUFDWixPQUFpQztJQUVqQyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU87UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDOUUsSUFBSSxFQUFVLENBQUM7SUFDZixJQUFJLENBQUM7UUFDSCxFQUFFLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFD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QUMsQ0FBQztRQUN2RixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEUsTUFBTSxLQUFLLEdBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzRixJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssR0FBRztZQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0QsY0FBYyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3QixXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMzRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMb2dBZGRyZXNzIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgb3duRGF0YSB9IGZyb20gJy4uL2NhcHR1cmUvbm90ZVNoYXBlLmpzJztcbmltcG9ydCB7IGNoZWNrU2lnbmFsLCBpbmRleGVkQWRkcmVzcywgaW5kZXhlZExpbWl0cywgSW5kZXhlZFJlZnVzYWwsIHJlZnVzZWQgfSBmcm9tICcuL2luZGV4ZWRBZG1pc3Npb24uanMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0SWRlbnRpdHksXG4gIGJvdW5kZWRJbmRleGVkV29yayxcbiAgY2xvc2VEZXNjcmlwdG9yLFxuICBkaWdlc3QsXG4gIGZpbGVJZGVudGl0eSxcbiAgb3BlbkluZGV4ZWREZXNjcmlwdG9yLFxuICByZWFkQnl0ZXMsXG59IGZyb20gJy4vaW5kZXhlZElPLmpzJztcbmltcG9ydCB7IHNjYW5JbmRleGVkRmlsZSB9IGZyb20gJy4vaW5kZXhlZFNjYW4uanMnO1xuaW1wb3J0IHR5cGUge1xuICBJbmRleGVkTGltaXRzLFxuICBJbmRleGVkUmFuZ2UsXG4gIEluZGV4ZWRSZWNvcmRGaWxlLFxuICBJbmRleGVkUmVjb3JkRmlsZU9wdGlvbnMsXG4gIEluZGV4ZWRSZWNvcmRGaWxlUmVzdWx0LFxuICBJbmRleGVkUmVjb3JkU2NvcGUsXG4gIEluZGV4ZWRSZWNvcmRVbmtub3duLFxufSBmcm9tICcuL2luZGV4ZWRUeXBlcy5qcyc7XG5cbi8qKiBFeHBsaWNpdCBib3VuZGVkIHdob2xlLWZpbGUgcHJlcGFyYXRpb24sIGZvbGxvd2VkIGJ5IGF1dGhvcml6ZWQgcG9zaXRpb25hbCBzY29wZSByZWFkcyBmcm9tIHRoYXQgaW1tdXRhYmxlIGZpbGUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlbkluZGV4ZWRSZWNvcmRGaWxlKFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEluZGV4ZWRSZWNvcmRGaWxlT3B0aW9ucyxcbik6IFByb21pc2U8SW5kZXhlZFJlY29yZEZpbGVSZXN1bHQ+IHtcbiAgY29uc3QgbGltaXRzID0gaW5kZXhlZExpbWl0cyhvcHRpb25zKTtcbiAgaWYgKGxpbWl0cy5zaWduYWw/LmFib3J0ZWQpIHJldHVybiB7IHN0YXR1czogJ3Vua25vd24nLCByZWFzb246ICdjYW5jZWxsZWQnIH07XG4gIGxldCBmZDogbnVtYmVyO1xuICB0cnkge1xuICAgIGZkID0gb3BlbkluZGV4ZWREZXNjcmlwdG9yKHBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBzdGF0dXM6ICd1bmtub3duJywgcmVhc29uOiAndW5hdmFpbGFibGUnIH07XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSB7IHByZXBhcmF0aW9uQnl0ZXM6IDAsIHNjb3BlQnl0ZXM6IDAsIHJlYWRDYWxsczogMCB9O1xuICBsZXQgcHJlcGFyZWQgPSBmYWxzZTtcbiAgbGV0IGFiYW5kb25lZCA9IGZhbHNlO1xuICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICBsZXQgY2xvc2VQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBjb25zdCByZWxlYXNlID0gKCkgPT4gKGNsb3NlUHJvbWlzZSA/Pz0gY2xvc2VEZXNjcmlwdG9yKGZkKSk7XG4gIHRyeSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBmaWxlSWRlbnRpdHkoZmQpO1xuICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJvdW5kZWRJbmRleGVkV29yayhcbiAgICAgIChzaWduYWwpID0+IHNjYW5JbmRleGVkRmlsZShmZCwgaWRlbnRpdHksIGxpbWl0cywgc2lnbmFsLCAoYnl0ZXMpID0+IChzdGF0cy5wcmVwYXJhdGlvbkJ5dGVzICs9IGJ5dGVzKSksXG4gICAgICBsaW1pdHMudGltZW91dE1zLFxuICAgICAgbGltaXRzLnNpZ25hbCxcbiAgICAgICgpID0+IHtcbiAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoYWJhbmRvbmVkKSByZWxlYXNlKCk7XG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgTWFwKSkgcmV0dXJuIHJlc3VsdDtcbiAgICBwcmVwYXJlZCA9IHRydWU7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAncmVhZHknLCByZWFkZXI6IGluZGV4ZWRSZWFkZXIoZmQsIGlkZW50aXR5LmtleSwgcmVzdWx0LCBsaW1pdHMsIHN0YXRzKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiByZWZ1c2VkKGVycm9yKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoIXByZXBhcmVkKSB7XG4gICAgICBhYmFuZG9uZWQgPSB0cnVlO1xuICAgICAgaWYgKCFydW5uaW5nKSBhd2FpdCByZWxlYXNlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4ZWRSZWFkZXIoXG4gIGZkOiBudW1iZXIsXG4gIGlkZW50aXR5OiBzdHJpbmcsXG4gIGluZGV4OiBSZWFkb25seU1hcDxzdHJpbmcsIHJlYWRvbmx5IEluZGV4ZWRSYW5nZVtdPixcbiAgbGltaXRzOiBJbmRleGVkTGltaXRzLFxuICBzdGF0czogeyBwcmVwYXJhdGlvbkJ5dGVzOiBudW1iZXI7IHNjb3BlQnl0ZXM6IG51bWJlcjsgcmVhZENhbGxzOiBudW1iZXIgfSxcbik6IEluZGV4ZWRSZWNvcmRGaWxlIHtcbiAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gIGxldCBmaW5pc2hDbG9zZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICBsZXQgY2xvc2VQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBjb25zdCByZWxlYXNlID0gKCkgPT4ge1xuICAgIGlmIChjbG9zZWQgJiYgIWFjdGl2ZSkgY2xvc2VEZXNjcmlwdG9yKGZkKS50aGVuKCgpID0+IGZpbmlzaENsb3NlPy4oKSk7XG4gIH07XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBnZXQgc3RhdHMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IC4uLnN0YXRzIH0pO1xuICAgIH0sXG4gICAgYXN5bmMgcmVhZFNjb3BlKGFkZHJlc3M6IExvZ0FkZHJlc3MsIGNvbnRleHQ/OiB7IHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsIH0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb250ZXh0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAoIWNvbnRleHQgfHxcbiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihjb250ZXh0KSAhPT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgICAgICAgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29udGV4dCwgJ3NpZ25hbCcpICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbnRleHQsICdzaWduYWwnKSwgJ3ZhbHVlJykpKVxuICAgICAgICApXG4gICAgICAgICAgdGhyb3cgbmV3IEluZGV4ZWRSZWZ1c2FsKCdpbnZhbGlkLWRhdGEnKTtcbiAgICAgICAgY29uc3Qgc2lnbmFsID0gY29udGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogKG93bkRhdGEoY29udGV4dCwgJ3NpZ25hbCcpIGFzIEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmICEoc2lnbmFsIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpKSB0aHJvdyBuZXcgSW5kZXhlZFJlZnVzYWwoJ2ludmFsaWQtZGF0YScpO1xuICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBuZXcgSW5kZXhlZFJlZnVzYWwoJ2NhbmNlbGxlZCcpO1xuICAgICAgICBpZiAoY2xvc2VkKSB0aHJvdyBuZXcgSW5kZXhlZFJlZnVzYWwoJ2Nsb3NlZCcpO1xuICAgICAgICBjb25zdCBrZXkgPSBpbmRleGVkQWRkcmVzcyhhZGRyZXNzKTtcbiAgICAgICAgaWYgKCFsaW1pdHMuYWxsb3dlZC5oYXMoa2V5KSkgdGhyb3cgbmV3IEluZGV4ZWRSZWZ1c2FsKCdub3QtcGVybWl0dGVkJyk7XG4gICAgICAgIGlmIChhY3RpdmUpIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnYnVzeScpO1xuICAgICAgICBhc3NlcnRJZGVudGl0eShmZCwgaWRlbnRpdHkpO1xuICAgICAgICBjb25zdCByYW5nZXMgPSBpbmRleC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFyYW5nZXMpIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnbm8tbWF0Y2gnKTtcbiAgICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJvdW5kZWRJbmRleGVkV29yayhcbiAgICAgICAgICAoaW5uZXIpID0+XG4gICAgICAgICAgICBsb2FkSW5kZXhlZFNjb3BlKFxuICAgICAgICAgICAgICBmZCxcbiAgICAgICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgcmFuZ2VzLFxuICAgICAgICAgICAgICBpbm5lcixcbiAgICAgICAgICAgICAgKGJ5dGVzKSA9PiAoc3RhdHMuc2NvcGVCeXRlcyArPSBieXRlcyksXG4gICAgICAgICAgICAgICgpID0+IHN0YXRzLnJlYWRDYWxscysrLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBsaW1pdHMudGltZW91dE1zLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHJlZnVzZWQoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xvc2UoKSB7XG4gICAgICBpZiAoIWNsb3NlUHJvbWlzZSkge1xuICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICBjbG9zZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gKGZpbmlzaENsb3NlID0gcmVzb2x2ZSkpO1xuICAgICAgICByZWxlYXNlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvc2VQcm9taXNlO1xuICAgIH0sXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkSW5kZXhlZFNjb3BlKFxuICBmZDogbnVtYmVyLFxuICBpZGVudGl0eTogc3RyaW5nLFxuICBrZXk6IHN0cmluZyxcbiAgcmFuZ2VzOiByZWFkb25seSBJbmRleGVkUmFuZ2VbXSxcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgY291bnQ6IChieXRlczogbnVtYmVyKSA9PiB2b2lkLFxuICBzdWJtaXR0ZWQ6ICgpID0+IHZvaWQsXG4pOiBQcm9taXNlPEluZGV4ZWRSZWNvcmRTY29wZSB8IEluZGV4ZWRSZWNvcmRVbmtub3duPiB7XG4gIGNvbnN0IGVudHJpZXM6IHVua25vd25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcykge1xuICAgIGNoZWNrU2lnbmFsKHNpZ25hbCk7XG4gICAgY29uc3QgYnl0ZXMgPSBhd2FpdCByZWFkQnl0ZXMoZmQsIHJhbmdlLm9mZnNldCwgcmFuZ2UuYnl0ZXMsIHNpZ25hbCwgY291bnQsIHN1Ym1pdHRlZCk7XG4gICAgaWYgKGRpZ2VzdChieXRlcykgIT09IHJhbmdlLmRpZ2VzdCkgdGhyb3cgbmV3IEluZGV4ZWRSZWZ1c2FsKCdzdGFsZScpO1xuICAgIGNvbnN0IGVudHJ5OiB1bmtub3duID0gSlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoJ3V0Zi04JywgeyBmYXRhbDogdHJ1ZSB9KS5kZWNvZGUoYnl0ZXMpKTtcbiAgICBpZiAoaW5kZXhlZEFkZHJlc3Mob3duRGF0YShlbnRyeSwgJ2FkZHJlc3MnKSkgIT09IGtleSkgdGhyb3cgbmV3IEluZGV4ZWRSZWZ1c2FsKCdpbnZhbGlkLWRhdGEnKTtcbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG4gIGFzc2VydElkZW50aXR5KGZkLCBpZGVudGl0eSk7XG4gIGNoZWNrU2lnbmFsKHNpZ25hbCk7XG4gIHJldHVybiB7IHN0YXR1czogJ2xvYWRlZCcsIGVudHJpZXMsIGJ5dGVzUmVhZDogcmFuZ2VzLnJlZHVjZSgodG90YWwsIHJhbmdlKSA9PiB0b3RhbCArIHJhbmdlLmJ5dGVzLCAwKSB9O1xufVxuIl19
@@ -0,0 +1,6 @@
1
+ import type { IndexedLimits, IndexedRange } from './indexedTypes.js';
2
+ /** One whole-file preparation pass. Only authorized range metadata is retained, never the archive's values. */
3
+ export declare function scanIndexedFile(fd: number, identity: {
4
+ readonly key: string;
5
+ readonly size: number;
6
+ }, limits: IndexedLimits, signal: AbortSignal, count: (bytes: number) => void): Promise<Map<string, readonly IndexedRange[]>>;
@@ -0,0 +1,73 @@
1
+ import { ownData } from '../capture/noteShape.js';
2
+ import { checkSignal, indexedAddress, IndexedRefusal } from './indexedAdmission.js';
3
+ import { assertIdentity, digest, readBytes } from './indexedIO.js';
4
+ /** One whole-file preparation pass. Only authorized range metadata is retained, never the archive's values. */
5
+ export async function scanIndexedFile(fd, identity, limits, signal, count) {
6
+ if (identity.size > limits.maxBytes)
7
+ throw new IndexedRefusal('too-large');
8
+ const index = new Map();
9
+ const totals = new Map();
10
+ let entries = 0;
11
+ let lineStart = 0;
12
+ let pieces = [];
13
+ let lineBytes = 0;
14
+ const append = (piece) => {
15
+ lineBytes += piece.length;
16
+ if (lineBytes > limits.maxEntryBytes)
17
+ throw new IndexedRefusal('too-large');
18
+ if (piece.length)
19
+ pieces.push(piece);
20
+ };
21
+ const decoder = new TextDecoder('utf-8', { fatal: true });
22
+ for (let position = 0; position < identity.size;) {
23
+ checkSignal(signal);
24
+ const chunk = await readBytes(fd, position, Math.min(65536, identity.size - position), signal, count);
25
+ position += chunk.length;
26
+ let start = 0;
27
+ for (let end = 0; end < chunk.length; end++) {
28
+ if (chunk[end] !== 10)
29
+ continue;
30
+ append(chunk.subarray(start, end + 1));
31
+ // Assemble once at the delimiter, rather than repeatedly copying a growing partial line.
32
+ const bytes = new Uint8Array(lineBytes);
33
+ let filled = 0;
34
+ for (const piece of pieces) {
35
+ bytes.set(piece, filled);
36
+ filled += piece.length;
37
+ }
38
+ const text = decoder.decode(bytes);
39
+ if (text.trim()) {
40
+ if (++entries > limits.maxEntries)
41
+ throw new IndexedRefusal('too-large');
42
+ let row;
43
+ try {
44
+ row = JSON.parse(text);
45
+ }
46
+ catch {
47
+ throw new IndexedRefusal('invalid-data');
48
+ }
49
+ const scope = indexedAddress(ownData(row, 'address'));
50
+ if (limits.allowed.has(scope)) {
51
+ const total = (totals.get(scope) ?? 0) + bytes.length;
52
+ if (total > limits.maxScopeBytes)
53
+ throw new IndexedRefusal('too-large');
54
+ totals.set(scope, total);
55
+ const ranges = index.get(scope) ?? [];
56
+ ranges.push({ offset: lineStart, bytes: bytes.length, digest: digest(bytes) });
57
+ index.set(scope, ranges);
58
+ }
59
+ }
60
+ lineStart += bytes.length;
61
+ pieces = [];
62
+ lineBytes = 0;
63
+ start = end + 1;
64
+ }
65
+ append(chunk.subarray(start));
66
+ }
67
+ if (lineBytes)
68
+ throw new IndexedRefusal('invalid-data'); // a torn tail never becomes an absent event
69
+ assertIdentity(fd, identity.key);
70
+ checkSignal(signal);
71
+ return index;
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZFNjYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NpbmtzL2luZGV4ZWRTY2FuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUduRSwrR0FBK0c7QUFDL0csTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLEVBQVUsRUFDVixRQUF5RCxFQUN6RCxNQUFxQixFQUNyQixNQUFtQixFQUNuQixLQUE4QjtJQUU5QixJQUFJLFFBQVEsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVE7UUFBRSxNQUFNLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUEwQixDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3pDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbEIsSUFBSSxNQUFNLEdBQWlCLEVBQUUsQ0FBQztJQUM5QixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7UUFDbkMsU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLGFBQWE7WUFBRSxNQUFNLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVFLElBQUksS0FBSyxDQUFDLE1BQU07WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFD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LENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMzQixDQUFDO1lBQ0gsQ0FBQztZQUNELFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzFCLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDWixTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksU0FBUztRQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyw0Q0FBNEM7SUFDckcsY0FBYyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG93bkRhdGEgfSBmcm9tICcuLi9jYXB0dXJlL25vdGVTaGFwZS5qcyc7XG5pbXBvcnQgeyBjaGVja1NpZ25hbCwgaW5kZXhlZEFkZHJlc3MsIEluZGV4ZWRSZWZ1c2FsIH0gZnJvbSAnLi9pbmRleGVkQWRtaXNzaW9uLmpzJztcbmltcG9ydCB7IGFzc2VydElkZW50aXR5LCBkaWdlc3QsIHJlYWRCeXRlcyB9IGZyb20gJy4vaW5kZXhlZElPLmpzJztcbmltcG9ydCB0eXBlIHsgSW5kZXhlZExpbWl0cywgSW5kZXhlZFJhbmdlIH0gZnJvbSAnLi9pbmRleGVkVHlwZXMuanMnO1xuXG4vKiogT25lIHdob2xlLWZpbGUgcHJlcGFyYXRpb24gcGFzcy4gT25seSBhdXRob3JpemVkIHJhbmdlIG1ldGFkYXRhIGlzIHJldGFpbmVkLCBuZXZlciB0aGUgYXJjaGl2ZSdzIHZhbHVlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2FuSW5kZXhlZEZpbGUoXG4gIGZkOiBudW1iZXIsXG4gIGlkZW50aXR5OiB7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBzaXplOiBudW1iZXIgfSxcbiAgbGltaXRzOiBJbmRleGVkTGltaXRzLFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICBjb3VudDogKGJ5dGVzOiBudW1iZXIpID0+IHZvaWQsXG4pOiBQcm9taXNlPE1hcDxzdHJpbmcsIHJlYWRvbmx5IEluZGV4ZWRSYW5nZVtdPj4ge1xuICBpZiAoaWRlbnRpdHkuc2l6ZSA+IGxpbWl0cy5tYXhCeXRlcykgdGhyb3cgbmV3IEluZGV4ZWRSZWZ1c2FsKCd0b28tbGFyZ2UnKTtcbiAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgSW5kZXhlZFJhbmdlW10+KCk7XG4gIGNvbnN0IHRvdGFscyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGxldCBlbnRyaWVzID0gMDtcbiAgbGV0IGxpbmVTdGFydCA9IDA7XG4gIGxldCBwaWVjZXM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgbGluZUJ5dGVzID0gMDtcbiAgY29uc3QgYXBwZW5kID0gKHBpZWNlOiBVaW50OEFycmF5KSA9PiB7XG4gICAgbGluZUJ5dGVzICs9IHBpZWNlLmxlbmd0aDtcbiAgICBpZiAobGluZUJ5dGVzID4gbGltaXRzLm1heEVudHJ5Qnl0ZXMpIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgndG9vLWxhcmdlJyk7XG4gICAgaWYgKHBpZWNlLmxlbmd0aCkgcGllY2VzLnB1c2gocGllY2UpO1xuICB9O1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgZmF0YWw6IHRydWUgfSk7XG4gIGZvciAobGV0IHBvc2l0aW9uID0gMDsgcG9zaXRpb24gPCBpZGVudGl0eS5zaXplOyApIHtcbiAgICBjaGVja1NpZ25hbChzaWduYWwpO1xuICAgIGNvbnN0IGNodW5rID0gYXdhaXQgcmVhZEJ5dGVzKGZkLCBwb3NpdGlvbiwgTWF0aC5taW4oNjU1MzYsIGlkZW50aXR5LnNpemUgLSBwb3NpdGlvbiksIHNpZ25hbCwgY291bnQpO1xuICAgIHBvc2l0aW9uICs9IGNodW5rLmxlbmd0aDtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGZvciAobGV0IGVuZCA9IDA7IGVuZCA8IGNodW5rLmxlbmd0aDsgZW5kKyspIHtcbiAgICAgIGlmIChjaHVua1tlbmRdICE9PSAxMCkgY29udGludWU7XG4gICAgICBhcHBlbmQoY2h1bmsuc3ViYXJyYXkoc3RhcnQsIGVuZCArIDEpKTtcbiAgICAgIC8vIEFzc2VtYmxlIG9uY2UgYXQgdGhlIGRlbGltaXRlciwgcmF0aGVyIHRoYW4gcmVwZWF0ZWRseSBjb3B5aW5nIGEgZ3Jvd2luZyBwYXJ0aWFsIGxpbmUuXG4gICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxpbmVCeXRlcyk7XG4gICAgICBsZXQgZmlsbGVkID0gMDtcbiAgICAgIGZvciAoY29uc3QgcGllY2Ugb2YgcGllY2VzKSB7XG4gICAgICAgIGJ5dGVzLnNldChwaWVjZSwgZmlsbGVkKTtcbiAgICAgICAgZmlsbGVkICs9IHBpZWNlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShieXRlcyk7XG4gICAgICBpZiAodGV4dC50cmltKCkpIHtcbiAgICAgICAgaWYgKCsrZW50cmllcyA+IGxpbWl0cy5tYXhFbnRyaWVzKSB0aHJvdyBuZXcgSW5kZXhlZFJlZnVzYWwoJ3Rvby1sYXJnZScpO1xuICAgICAgICBsZXQgcm93OiB1bmtub3duO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJvdyA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgnaW52YWxpZC1kYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBpbmRleGVkQWRkcmVzcyhvd25EYXRhKHJvdywgJ2FkZHJlc3MnKSk7XG4gICAgICAgIGlmIChsaW1pdHMuYWxsb3dlZC5oYXMoc2NvcGUpKSB7XG4gICAgICAgICAgY29uc3QgdG90YWwgPSAodG90YWxzLmdldChzY29wZSkgPz8gMCkgKyBieXRlcy5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRvdGFsID4gbGltaXRzLm1heFNjb3BlQnl0ZXMpIHRocm93IG5ldyBJbmRleGVkUmVmdXNhbCgndG9vLWxhcmdlJyk7XG4gICAgICAgICAgdG90YWxzLnNldChzY29wZSwgdG90YWwpO1xuICAgICAgICAgIGNvbnN0IHJhbmdlcyA9IGluZGV4LmdldChzY29wZSkgPz8gW107XG4gICAgICAgICAgcmFuZ2VzLnB1c2goeyBvZmZzZXQ6IGxpbmVTdGFydCwgYnl0ZXM6IGJ5dGVzLmxlbmd0aCwgZGlnZXN0OiBkaWdlc3QoYnl0ZXMpIH0pO1xuICAgICAgICAgIGluZGV4LnNldChzY29wZSwgcmFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGluZVN0YXJ0ICs9IGJ5dGVzLmxlbmd0aDtcbiAgICAgIHBpZWNlcyA9IFtdO1xuICAgICAgbGluZUJ5dGVzID0gMDtcbiAgICAgIHN0YXJ0ID0gZW5kICsgMTtcbiAgICB9XG4gICAgYXBwZW5kKGNodW5rLnN1YmFycmF5KHN0YXJ0KSk7XG4gIH1cbiAgaWYgKGxpbmVCeXRlcykgdGhyb3cgbmV3IEluZGV4ZWRSZWZ1c2FsKCdpbnZhbGlkLWRhdGEnKTsgLy8gYSB0b3JuIHRhaWwgbmV2ZXIgYmVjb21lcyBhbiBhYnNlbnQgZXZlbnRcbiAgYXNzZXJ0SWRlbnRpdHkoZmQsIGlkZW50aXR5LmtleSk7XG4gIGNoZWNrU2lnbmFsKHNpZ25hbCk7XG4gIHJldHVybiBpbmRleDtcbn1cbiJdfQ==
@@ -0,0 +1,60 @@
1
+ import type { LogAddress } from 'foottrace';
2
+ /** Host authorization is fixed before any stored entry is read. It is never inferred from the index. */
3
+ export interface IndexedRecordFileOptions {
4
+ readonly allowedScopes: readonly LogAddress[];
5
+ /** Preparation scans at most this many file bytes. Default 64 MiB, maximum 256 MiB. */
6
+ readonly maxBytes?: number;
7
+ /** Maximum encoded JSON line. Default 8 MiB, maximum 8 MiB. */
8
+ readonly maxEntryBytes?: number;
9
+ /** Maximum entries indexed across the file. Default 16,384, maximum 65,536. */
10
+ readonly maxEntries?: number;
11
+ /** Maximum bytes read by one selected-scope request. Default 8 MiB, maximum 64 MiB. */
12
+ readonly maxScopeBytes?: number;
13
+ /** Bounds each preparation/read wait; unfinished filesystem work retains its slot. Default 10s, maximum 30s. */
14
+ readonly timeoutMs?: number;
15
+ readonly signal?: AbortSignal;
16
+ }
17
+ export type IndexedRecordFileReason = 'cancelled' | 'timeout' | 'unavailable' | 'invalid-data' | 'too-large' | 'not-permitted' | 'no-match' | 'stale' | 'busy' | 'closed';
18
+ export interface IndexedRecordUnknown {
19
+ readonly status: 'unknown';
20
+ readonly reason: IndexedRecordFileReason;
21
+ }
22
+ export interface IndexedRecordScope {
23
+ readonly status: 'loaded';
24
+ /** Raw untrusted entries for public readStoredRecord/readStoredCapture; loading grants no completeness. */
25
+ readonly entries: readonly unknown[];
26
+ readonly bytesRead: number;
27
+ }
28
+ /** One immutable-file selection capability. No path, descriptor, mutable index or discovered run catalog is served. */
29
+ export interface IndexedRecordFile {
30
+ /** Returned-byte counters and actual scope-read submissions (including failed and pending requests). */
31
+ readonly stats: {
32
+ readonly preparationBytes: number;
33
+ readonly scopeBytes: number;
34
+ readonly readCalls: number;
35
+ };
36
+ readScope(address: LogAddress, context?: {
37
+ readonly signal?: AbortSignal;
38
+ }): Promise<IndexedRecordScope | IndexedRecordUnknown>;
39
+ /** Stop new work immediately, release the descriptor after in-flight work settles. Idempotent. */
40
+ close(): Promise<void>;
41
+ }
42
+ export type IndexedRecordFileResult = {
43
+ readonly status: 'ready';
44
+ readonly reader: IndexedRecordFile;
45
+ } | IndexedRecordUnknown;
46
+ /** @internal Only the preparation pass produces ranges; they never cross the public boundary. */
47
+ export interface IndexedRange {
48
+ readonly offset: number;
49
+ readonly bytes: number;
50
+ readonly digest: string;
51
+ }
52
+ export interface IndexedLimits {
53
+ readonly allowed: ReadonlySet<string>;
54
+ readonly maxBytes: number;
55
+ readonly maxEntryBytes: number;
56
+ readonly maxEntries: number;
57
+ readonly maxScopeBytes: number;
58
+ readonly timeoutMs: number;
59
+ readonly signal?: AbortSignal;
60
+ }