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.
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/capture/readSources.d.ts +13 -2
- package/dist/esm/lib/capture/readSources.js +11 -3
- package/dist/esm/lib/capture/sourceOwnership.d.ts +21 -0
- package/dist/esm/lib/capture/sourceOwnership.js +133 -0
- package/dist/esm/lib/capture/sourceOwnershipFormat.d.ts +35 -0
- package/dist/esm/lib/capture/sourceOwnershipFormat.js +31 -0
- package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +5 -1
- package/dist/esm/lib/capture/storedReadSourceCounts.js +15 -11
- package/dist/esm/lib/capture/storedReadSources.js +21 -5
- package/dist/esm/lib/capture/storedSourceOwnership.d.ts +8 -0
- package/dist/esm/lib/capture/storedSourceOwnership.js +100 -0
- package/dist/esm/lib/engine/handlers/StageRunner.js +2 -1
- package/dist/esm/lib/memory/StageContext.d.ts +3 -0
- package/dist/esm/lib/memory/StageContext.js +29 -8
- package/dist/esm/lib/memory/frameTypes.d.ts +2 -0
- package/dist/esm/lib/memory/frameTypes.js +1 -1
- package/dist/esm/lib/sinks/indexedAdmission.d.ts +14 -0
- package/dist/esm/lib/sinks/indexedAdmission.js +77 -0
- package/dist/esm/lib/sinks/indexedIO.d.ts +14 -0
- package/dist/esm/lib/sinks/indexedIO.js +96 -0
- package/dist/esm/lib/sinks/indexedRecordFile.d.ts +3 -0
- package/dist/esm/lib/sinks/indexedRecordFile.js +120 -0
- package/dist/esm/lib/sinks/indexedScan.d.ts +6 -0
- package/dist/esm/lib/sinks/indexedScan.js +73 -0
- package/dist/esm/lib/sinks/indexedTypes.d.ts +60 -0
- package/dist/esm/lib/sinks/indexedTypes.js +2 -0
- package/dist/esm/sinks.d.ts +2 -0
- package/dist/esm/sinks.js +2 -1
- package/dist/index.js +1 -1
- package/dist/lib/capture/readSources.js +11 -3
- package/dist/lib/capture/sourceOwnership.js +138 -0
- package/dist/lib/capture/sourceOwnershipFormat.js +35 -0
- package/dist/lib/capture/storedReadSourceCounts.js +15 -11
- package/dist/lib/capture/storedReadSources.js +21 -5
- package/dist/lib/capture/storedSourceOwnership.js +104 -0
- package/dist/lib/engine/handlers/StageRunner.js +2 -1
- package/dist/lib/memory/StageContext.js +29 -8
- package/dist/lib/memory/frameTypes.js +1 -1
- package/dist/lib/sinks/indexedAdmission.js +85 -0
- package/dist/lib/sinks/indexedIO.js +106 -0
- package/dist/lib/sinks/indexedRecordFile.js +124 -0
- package/dist/lib/sinks/indexedScan.js +77 -0
- package/dist/lib/sinks/indexedTypes.js +3 -0
- package/dist/sinks.js +4 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/lib/capture/readSources.d.ts +13 -2
- package/dist/types/lib/capture/sourceOwnership.d.ts +21 -0
- package/dist/types/lib/capture/sourceOwnershipFormat.d.ts +35 -0
- package/dist/types/lib/capture/storedReadSourceCounts.d.ts +5 -1
- package/dist/types/lib/capture/storedSourceOwnership.d.ts +8 -0
- package/dist/types/lib/memory/StageContext.d.ts +3 -0
- package/dist/types/lib/memory/frameTypes.d.ts +2 -0
- package/dist/types/lib/sinks/indexedAdmission.d.ts +14 -0
- package/dist/types/lib/sinks/indexedIO.d.ts +14 -0
- package/dist/types/lib/sinks/indexedRecordFile.d.ts +3 -0
- package/dist/types/lib/sinks/indexedScan.d.ts +6 -0
- package/dist/types/lib/sinks/indexedTypes.d.ts +60 -0
- package/dist/types/sinks.d.ts +2 -0
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZFJlY29yZEZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NpbmtzL2luZGV4ZWRSZWNvcmRGaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVHLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixNQUFNLEVBQ04sWUFBWSxFQUNaLHFCQUFxQixFQUNyQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFXbkQsdUhBQXVIO0FBQ3ZILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLElBQVksRUFDWixPQUFpQztJQUVqQyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU87UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDOUUsSUFBSSxFQUFVLENBQUM7SUFDZixJQUFJLENBQUM7UUFDSCxFQUFFLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDbkUsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN0QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsSUFBSSxZQUF1QyxDQUFDO0lBQzVDLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsWUFBWSxLQUFLLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQkFBa0IsQ0FDckMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQ3ZHLE1BQU0sQ0FBQyxTQUFTLEVBQ2hCLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsR0FBRyxFQUFFO1lBQ0gsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLFNBQVM7Z0JBQUUsT0FBTyxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDNUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUM3RixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7WUFBUyxDQUFDO1FBQ1QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTztnQkFBRSxNQUFNLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUNwQixFQUFVLEVBQ1YsUUFBZ0IsRUFDaEIsS0FBbUQsRUFDbkQsTUFBcUIsRUFDckIsS0FBMEU7SUFFMUUsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNuQixJQUFJLFdBQXFDLENBQUM7SUFDMUMsSUFBSSxZQUF1QyxDQUFDO0lBQzVDLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRTtRQUNuQixJQUFJLE1BQU0sSUFBSSxDQUFDLE1BQU07WUFBRSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDLENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbkIsSUFBSSxLQUFLO1lBQ1AsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQW1CLEVBQUUsT0FBMkM7WUFDOUUsSUFBSSxDQUFDO2dCQUNILElBQ0UsT0FBTyxLQUFLLFNBQVM7b0JBQ3JCLENBQUMsQ0FBQyxPQUFPO3dCQUNQLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVM7d0JBQ25ELENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSyxTQUFTOzRCQUMvRCxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBRXhHLE1BQU0sSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQTZCLENBQUM7Z0JBQzNHLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLFdBQVcsQ0FBQztvQkFBRSxNQUFNLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN2RyxJQUFJLE1BQU0sRUFBRSxPQUFPO29CQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzNELElBQUksTUFBTTtvQkFBRSxNQUFNLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQUUsTUFBTSxJQUFJLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxNQUFNO29CQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxNQUFNO29CQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2QsT0FBTyxNQUFNLGtCQUFrQixDQUM3QixDQUFDLEtBQUssRUFBRSxFQUFFLENBQ1IsZ0JBQWdCLENBQ2QsRUFBRSxFQUNGLFFBQVEsRUFDUixHQUFHLEVBQ0gsTUFBTSxFQUNOLEtBQUssRUFDTCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxFQUN0QyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQ3hCLEVBQ0gsTUFBTSxDQUFDLFNBQVMsRUFDaEIsTUFBTSxFQUNOLEdBQUcsRUFBRTtvQkFDSCxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNmLE9BQU8sRUFBRSxDQUFDO2dCQUNaLENBQUMsQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLO1lBQ0gsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNsQixNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNkLFlBQVksR0FBRyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDdkUsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBQ0QsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQzdCLEVBQVUsRUFDVixRQUFnQixFQUNoQixHQUFXLEVBQ1gsTUFBK0IsRUFDL0IsTUFBbUIsRUFDbkIsS0FBOEIsRUFDOUIsU0FBcUI7SUFFckIsTUFBTSxPQUFPLEdBQWMsRUFBRSxDQUFDO0lBQzlCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEUsTUFBTSxLQUFLLEdBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzRixJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssR0FBRztZQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0QsY0FBYyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3QixXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMzRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMb2dBZGRyZXNzIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgb3duRGF0YSB9IGZyb20gJy4uL2NhcHR1cmUvbm90ZVNoYXBlLmpzJztcbmltcG9ydCB7IGNoZWNrU2lnbmFsLCBpbmRleGVkQWRkcmVzcywgaW5kZXhlZExpbWl0cywgSW5kZXhlZFJlZnVzYWwsIHJlZnVzZWQgfSBmcm9tICcuL2luZGV4ZWRBZG1pc3Npb24uanMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0SWRlbnRpdHksXG4gIGJvdW5kZWRJbmRleGVkV29yayxcbiAgY2xvc2VEZXNjcmlwdG9yLFxuICBkaWdlc3QsXG4gIGZpbGVJZGVudGl0eSxcbiAgb3BlbkluZGV4ZWREZXNjcmlwdG9yLFxuICByZWFkQnl0ZXMsXG59IGZyb20gJy4vaW5kZXhlZElPLmpzJztcbmltcG9ydCB7IHNjYW5JbmRleGVkRmlsZSB9IGZyb20gJy4vaW5kZXhlZFNjYW4uanMnO1xuaW1wb3J0IHR5cGUge1xuICBJbmRleGVkTGltaXRzLFxuICBJbmRleGVkUmFuZ2UsXG4gIEluZGV4ZWRSZWNvcmRGaWxlLFxuICBJbmRleGVkUmVjb3JkRmlsZU9wdGlvbnMsXG4gIEluZGV4ZWRSZWNvcmRGaWxlUmVzdWx0LFxuICBJbmRleGVkUmVjb3JkU2NvcGUsXG4gIEluZGV4ZWRSZWNvcmRVbmtub3duLFxufSBmcm9tICcuL2luZGV4ZWRUeXBlcy5qcyc7XG5cbi8qKiBFeHBsaWNpdCBib3VuZGVkIHdob2xlLWZpbGUgcHJlcGFyYXRpb24sIGZvbGxvd2VkIGJ5IGF1dGhvcml6ZWQgcG9zaXRpb25hbCBzY29wZSByZWFkcyBmcm9tIHRoYXQgaW1tdXRhYmxlIGZpbGUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlbkluZGV4ZWRSZWNvcmRGaWxlKFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEluZGV4ZWRSZWNvcmRGaWxlT3B0aW9ucyxcbik6IFByb21pc2U8SW5kZXhlZFJlY29yZEZpbGVSZXN1bHQ+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
|
+
}
|