rag-lite-ts 2.1.1 → 2.2.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/{core → cjs/core}/model-validator.js +1 -1
- package/dist/{core → cjs/core}/vector-index.js +4 -2
- package/dist/esm/api-errors.d.ts +90 -0
- package/dist/esm/api-errors.js +320 -0
- package/dist/esm/cli/indexer.d.ts +11 -0
- package/dist/esm/cli/indexer.js +471 -0
- package/dist/esm/cli/search.d.ts +7 -0
- package/dist/esm/cli/search.js +332 -0
- package/dist/esm/cli.d.ts +3 -0
- package/dist/esm/cli.js +529 -0
- package/dist/esm/config.d.ts +51 -0
- package/dist/esm/config.js +79 -0
- package/dist/esm/core/abstract-embedder.d.ts +125 -0
- package/dist/esm/core/abstract-embedder.js +264 -0
- package/dist/esm/core/actionable-error-messages.d.ts +60 -0
- package/dist/esm/core/actionable-error-messages.js +397 -0
- package/dist/esm/core/adapters.d.ts +93 -0
- package/dist/esm/core/adapters.js +139 -0
- package/dist/esm/core/batch-processing-optimizer.d.ts +155 -0
- package/dist/esm/core/batch-processing-optimizer.js +536 -0
- package/dist/esm/core/binary-index-format.d.ts +78 -0
- package/dist/esm/core/binary-index-format.js +291 -0
- package/dist/esm/core/chunker.d.ts +119 -0
- package/dist/esm/core/chunker.js +73 -0
- package/dist/esm/core/cli-database-utils.d.ts +53 -0
- package/dist/esm/core/cli-database-utils.js +239 -0
- package/dist/esm/core/config.d.ts +102 -0
- package/dist/esm/core/config.js +247 -0
- package/dist/esm/core/content-errors.d.ts +111 -0
- package/dist/esm/core/content-errors.js +362 -0
- package/dist/esm/core/content-manager.d.ts +335 -0
- package/dist/esm/core/content-manager.js +1476 -0
- package/dist/esm/core/content-performance-optimizer.d.ts +150 -0
- package/dist/esm/core/content-performance-optimizer.js +516 -0
- package/dist/esm/core/content-resolver.d.ts +104 -0
- package/dist/esm/core/content-resolver.js +285 -0
- package/dist/esm/core/cross-modal-search.d.ts +164 -0
- package/dist/esm/core/cross-modal-search.js +342 -0
- package/dist/esm/core/database-connection-manager.d.ts +109 -0
- package/dist/esm/core/database-connection-manager.js +310 -0
- package/dist/esm/core/db.d.ts +213 -0
- package/dist/esm/core/db.js +895 -0
- package/dist/esm/core/embedder-factory.d.ts +154 -0
- package/dist/esm/core/embedder-factory.js +311 -0
- package/dist/esm/core/error-handler.d.ts +112 -0
- package/dist/esm/core/error-handler.js +239 -0
- package/dist/esm/core/index.d.ts +59 -0
- package/dist/esm/core/index.js +69 -0
- package/dist/esm/core/ingestion.d.ts +202 -0
- package/dist/esm/core/ingestion.js +901 -0
- package/dist/esm/core/interfaces.d.ts +408 -0
- package/dist/esm/core/interfaces.js +106 -0
- package/dist/esm/core/lazy-dependency-loader.d.ts +147 -0
- package/dist/esm/core/lazy-dependency-loader.js +435 -0
- package/dist/esm/core/mode-detection-service.d.ts +150 -0
- package/dist/esm/core/mode-detection-service.js +565 -0
- package/dist/esm/core/mode-model-validator.d.ts +92 -0
- package/dist/esm/core/mode-model-validator.js +203 -0
- package/dist/esm/core/model-registry.d.ts +116 -0
- package/dist/esm/core/model-registry.js +411 -0
- package/dist/esm/core/model-validator.d.ts +217 -0
- package/dist/esm/core/model-validator.js +782 -0
- package/dist/esm/core/path-manager.d.ts +47 -0
- package/dist/esm/core/path-manager.js +71 -0
- package/dist/esm/core/raglite-paths.d.ts +121 -0
- package/dist/esm/core/raglite-paths.js +145 -0
- package/dist/esm/core/reranking-config.d.ts +42 -0
- package/dist/esm/core/reranking-config.js +147 -0
- package/dist/esm/core/reranking-factory.d.ts +92 -0
- package/dist/esm/core/reranking-factory.js +410 -0
- package/dist/esm/core/reranking-strategies.d.ts +310 -0
- package/dist/esm/core/reranking-strategies.js +650 -0
- package/dist/esm/core/resource-cleanup.d.ts +163 -0
- package/dist/esm/core/resource-cleanup.js +371 -0
- package/dist/esm/core/resource-manager.d.ts +212 -0
- package/dist/esm/core/resource-manager.js +564 -0
- package/dist/esm/core/search-pipeline.d.ts +111 -0
- package/dist/esm/core/search-pipeline.js +287 -0
- package/dist/esm/core/search.d.ts +141 -0
- package/dist/esm/core/search.js +320 -0
- package/dist/esm/core/streaming-operations.d.ts +145 -0
- package/dist/esm/core/streaming-operations.js +409 -0
- package/dist/esm/core/types.d.ts +66 -0
- package/dist/esm/core/types.js +6 -0
- package/dist/esm/core/universal-embedder.d.ts +177 -0
- package/dist/esm/core/universal-embedder.js +139 -0
- package/dist/esm/core/validation-messages.d.ts +99 -0
- package/dist/esm/core/validation-messages.js +334 -0
- package/dist/esm/core/vector-index.d.ts +72 -0
- package/dist/esm/core/vector-index.js +333 -0
- package/dist/esm/dom-polyfills.d.ts +6 -0
- package/dist/esm/dom-polyfills.js +37 -0
- package/dist/esm/factories/index.d.ts +27 -0
- package/dist/esm/factories/index.js +29 -0
- package/dist/esm/factories/ingestion-factory.d.ts +200 -0
- package/dist/esm/factories/ingestion-factory.js +477 -0
- package/dist/esm/factories/search-factory.d.ts +154 -0
- package/dist/esm/factories/search-factory.js +344 -0
- package/dist/esm/file-processor.d.ts +147 -0
- package/dist/esm/file-processor.js +963 -0
- package/dist/esm/index-manager.d.ts +116 -0
- package/dist/esm/index-manager.js +598 -0
- package/dist/esm/index.d.ts +75 -0
- package/dist/esm/index.js +110 -0
- package/dist/esm/indexer.d.ts +7 -0
- package/dist/esm/indexer.js +54 -0
- package/dist/esm/ingestion.d.ts +63 -0
- package/dist/esm/ingestion.js +124 -0
- package/dist/esm/mcp-server.d.ts +46 -0
- package/dist/esm/mcp-server.js +1820 -0
- package/dist/esm/multimodal/clip-embedder.d.ts +327 -0
- package/dist/esm/multimodal/clip-embedder.js +996 -0
- package/dist/esm/multimodal/index.d.ts +6 -0
- package/dist/esm/multimodal/index.js +6 -0
- package/dist/esm/preprocess.d.ts +19 -0
- package/dist/esm/preprocess.js +203 -0
- package/dist/esm/preprocessors/index.d.ts +17 -0
- package/dist/esm/preprocessors/index.js +38 -0
- package/dist/esm/preprocessors/mdx.d.ts +25 -0
- package/dist/esm/preprocessors/mdx.js +101 -0
- package/dist/esm/preprocessors/mermaid.d.ts +68 -0
- package/dist/esm/preprocessors/mermaid.js +329 -0
- package/dist/esm/preprocessors/registry.d.ts +56 -0
- package/dist/esm/preprocessors/registry.js +179 -0
- package/dist/esm/run-error-recovery-tests.d.ts +7 -0
- package/dist/esm/run-error-recovery-tests.js +101 -0
- package/dist/esm/search-standalone.d.ts +7 -0
- package/dist/esm/search-standalone.js +117 -0
- package/dist/esm/search.d.ts +99 -0
- package/dist/esm/search.js +177 -0
- package/dist/esm/test-utils.d.ts +18 -0
- package/dist/esm/test-utils.js +27 -0
- package/dist/esm/text/chunker.d.ts +33 -0
- package/dist/esm/text/chunker.js +279 -0
- package/dist/esm/text/embedder.d.ts +111 -0
- package/dist/esm/text/embedder.js +386 -0
- package/dist/esm/text/index.d.ts +8 -0
- package/dist/esm/text/index.js +9 -0
- package/dist/esm/text/preprocessors/index.d.ts +17 -0
- package/dist/esm/text/preprocessors/index.js +38 -0
- package/dist/esm/text/preprocessors/mdx.d.ts +25 -0
- package/dist/esm/text/preprocessors/mdx.js +101 -0
- package/dist/esm/text/preprocessors/mermaid.d.ts +68 -0
- package/dist/esm/text/preprocessors/mermaid.js +330 -0
- package/dist/esm/text/preprocessors/registry.d.ts +56 -0
- package/dist/esm/text/preprocessors/registry.js +180 -0
- package/dist/esm/text/reranker.d.ts +49 -0
- package/dist/esm/text/reranker.js +274 -0
- package/dist/esm/text/sentence-transformer-embedder.d.ts +96 -0
- package/dist/esm/text/sentence-transformer-embedder.js +340 -0
- package/dist/esm/text/tokenizer.d.ts +22 -0
- package/dist/esm/text/tokenizer.js +64 -0
- package/dist/esm/types.d.ts +83 -0
- package/dist/esm/types.js +3 -0
- package/dist/esm/utils/vector-math.d.ts +31 -0
- package/dist/esm/utils/vector-math.js +70 -0
- package/package.json +30 -12
- /package/dist/{api-errors.d.ts → cjs/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → cjs/api-errors.js} +0 -0
- /package/dist/{cli → cjs/cli}/indexer.d.ts +0 -0
- /package/dist/{cli → cjs/cli}/indexer.js +0 -0
- /package/dist/{cli → cjs/cli}/search.d.ts +0 -0
- /package/dist/{cli → cjs/cli}/search.js +0 -0
- /package/dist/{cli.d.ts → cjs/cli.d.ts} +0 -0
- /package/dist/{cli.js → cjs/cli.js} +0 -0
- /package/dist/{config.d.ts → cjs/config.d.ts} +0 -0
- /package/dist/{config.js → cjs/config.js} +0 -0
- /package/dist/{core → cjs/core}/abstract-embedder.d.ts +0 -0
- /package/dist/{core → cjs/core}/abstract-embedder.js +0 -0
- /package/dist/{core → cjs/core}/actionable-error-messages.d.ts +0 -0
- /package/dist/{core → cjs/core}/actionable-error-messages.js +0 -0
- /package/dist/{core → cjs/core}/adapters.d.ts +0 -0
- /package/dist/{core → cjs/core}/adapters.js +0 -0
- /package/dist/{core → cjs/core}/batch-processing-optimizer.d.ts +0 -0
- /package/dist/{core → cjs/core}/batch-processing-optimizer.js +0 -0
- /package/dist/{core → cjs/core}/binary-index-format.d.ts +0 -0
- /package/dist/{core → cjs/core}/binary-index-format.js +0 -0
- /package/dist/{core → cjs/core}/chunker.d.ts +0 -0
- /package/dist/{core → cjs/core}/chunker.js +0 -0
- /package/dist/{core → cjs/core}/cli-database-utils.d.ts +0 -0
- /package/dist/{core → cjs/core}/cli-database-utils.js +0 -0
- /package/dist/{core → cjs/core}/config.d.ts +0 -0
- /package/dist/{core → cjs/core}/config.js +0 -0
- /package/dist/{core → cjs/core}/content-errors.d.ts +0 -0
- /package/dist/{core → cjs/core}/content-errors.js +0 -0
- /package/dist/{core → cjs/core}/content-manager.d.ts +0 -0
- /package/dist/{core → cjs/core}/content-manager.js +0 -0
- /package/dist/{core → cjs/core}/content-performance-optimizer.d.ts +0 -0
- /package/dist/{core → cjs/core}/content-performance-optimizer.js +0 -0
- /package/dist/{core → cjs/core}/content-resolver.d.ts +0 -0
- /package/dist/{core → cjs/core}/content-resolver.js +0 -0
- /package/dist/{core → cjs/core}/cross-modal-search.d.ts +0 -0
- /package/dist/{core → cjs/core}/cross-modal-search.js +0 -0
- /package/dist/{core → cjs/core}/database-connection-manager.d.ts +0 -0
- /package/dist/{core → cjs/core}/database-connection-manager.js +0 -0
- /package/dist/{core → cjs/core}/db.d.ts +0 -0
- /package/dist/{core → cjs/core}/db.js +0 -0
- /package/dist/{core → cjs/core}/embedder-factory.d.ts +0 -0
- /package/dist/{core → cjs/core}/embedder-factory.js +0 -0
- /package/dist/{core → cjs/core}/error-handler.d.ts +0 -0
- /package/dist/{core → cjs/core}/error-handler.js +0 -0
- /package/dist/{core → cjs/core}/index.d.ts +0 -0
- /package/dist/{core → cjs/core}/index.js +0 -0
- /package/dist/{core → cjs/core}/ingestion.d.ts +0 -0
- /package/dist/{core → cjs/core}/ingestion.js +0 -0
- /package/dist/{core → cjs/core}/interfaces.d.ts +0 -0
- /package/dist/{core → cjs/core}/interfaces.js +0 -0
- /package/dist/{core → cjs/core}/lazy-dependency-loader.d.ts +0 -0
- /package/dist/{core → cjs/core}/lazy-dependency-loader.js +0 -0
- /package/dist/{core → cjs/core}/mode-detection-service.d.ts +0 -0
- /package/dist/{core → cjs/core}/mode-detection-service.js +0 -0
- /package/dist/{core → cjs/core}/mode-model-validator.d.ts +0 -0
- /package/dist/{core → cjs/core}/mode-model-validator.js +0 -0
- /package/dist/{core → cjs/core}/model-registry.d.ts +0 -0
- /package/dist/{core → cjs/core}/model-registry.js +0 -0
- /package/dist/{core → cjs/core}/model-validator.d.ts +0 -0
- /package/dist/{core → cjs/core}/path-manager.d.ts +0 -0
- /package/dist/{core → cjs/core}/path-manager.js +0 -0
- /package/dist/{core → cjs/core}/raglite-paths.d.ts +0 -0
- /package/dist/{core → cjs/core}/raglite-paths.js +0 -0
- /package/dist/{core → cjs/core}/reranking-config.d.ts +0 -0
- /package/dist/{core → cjs/core}/reranking-config.js +0 -0
- /package/dist/{core → cjs/core}/reranking-factory.d.ts +0 -0
- /package/dist/{core → cjs/core}/reranking-factory.js +0 -0
- /package/dist/{core → cjs/core}/reranking-strategies.d.ts +0 -0
- /package/dist/{core → cjs/core}/reranking-strategies.js +0 -0
- /package/dist/{core → cjs/core}/resource-cleanup.d.ts +0 -0
- /package/dist/{core → cjs/core}/resource-cleanup.js +0 -0
- /package/dist/{core → cjs/core}/resource-manager.d.ts +0 -0
- /package/dist/{core → cjs/core}/resource-manager.js +0 -0
- /package/dist/{core → cjs/core}/search-pipeline.d.ts +0 -0
- /package/dist/{core → cjs/core}/search-pipeline.js +0 -0
- /package/dist/{core → cjs/core}/search.d.ts +0 -0
- /package/dist/{core → cjs/core}/search.js +0 -0
- /package/dist/{core → cjs/core}/streaming-operations.d.ts +0 -0
- /package/dist/{core → cjs/core}/streaming-operations.js +0 -0
- /package/dist/{core → cjs/core}/types.d.ts +0 -0
- /package/dist/{core → cjs/core}/types.js +0 -0
- /package/dist/{core → cjs/core}/universal-embedder.d.ts +0 -0
- /package/dist/{core → cjs/core}/universal-embedder.js +0 -0
- /package/dist/{core → cjs/core}/validation-messages.d.ts +0 -0
- /package/dist/{core → cjs/core}/validation-messages.js +0 -0
- /package/dist/{core → cjs/core}/vector-index.d.ts +0 -0
- /package/dist/{dom-polyfills.d.ts → cjs/dom-polyfills.d.ts} +0 -0
- /package/dist/{dom-polyfills.js → cjs/dom-polyfills.js} +0 -0
- /package/dist/{factories → cjs/factories}/index.d.ts +0 -0
- /package/dist/{factories → cjs/factories}/index.js +0 -0
- /package/dist/{factories → cjs/factories}/ingestion-factory.d.ts +0 -0
- /package/dist/{factories → cjs/factories}/ingestion-factory.js +0 -0
- /package/dist/{factories → cjs/factories}/search-factory.d.ts +0 -0
- /package/dist/{factories → cjs/factories}/search-factory.js +0 -0
- /package/dist/{file-processor.d.ts → cjs/file-processor.d.ts} +0 -0
- /package/dist/{file-processor.js → cjs/file-processor.js} +0 -0
- /package/dist/{index-manager.d.ts → cjs/index-manager.d.ts} +0 -0
- /package/dist/{index-manager.js → cjs/index-manager.js} +0 -0
- /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- /package/dist/{index.js → cjs/index.js} +0 -0
- /package/dist/{indexer.d.ts → cjs/indexer.d.ts} +0 -0
- /package/dist/{indexer.js → cjs/indexer.js} +0 -0
- /package/dist/{ingestion.d.ts → cjs/ingestion.d.ts} +0 -0
- /package/dist/{ingestion.js → cjs/ingestion.js} +0 -0
- /package/dist/{mcp-server.d.ts → cjs/mcp-server.d.ts} +0 -0
- /package/dist/{mcp-server.js → cjs/mcp-server.js} +0 -0
- /package/dist/{multimodal → cjs/multimodal}/clip-embedder.d.ts +0 -0
- /package/dist/{multimodal → cjs/multimodal}/clip-embedder.js +0 -0
- /package/dist/{multimodal → cjs/multimodal}/index.d.ts +0 -0
- /package/dist/{multimodal → cjs/multimodal}/index.js +0 -0
- /package/dist/{preprocess.d.ts → cjs/preprocess.d.ts} +0 -0
- /package/dist/{preprocess.js → cjs/preprocess.js} +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/index.d.ts +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/index.js +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/mdx.d.ts +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/mdx.js +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/mermaid.d.ts +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/mermaid.js +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/registry.d.ts +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/registry.js +0 -0
- /package/dist/{run-error-recovery-tests.d.ts → cjs/run-error-recovery-tests.d.ts} +0 -0
- /package/dist/{run-error-recovery-tests.js → cjs/run-error-recovery-tests.js} +0 -0
- /package/dist/{search-standalone.d.ts → cjs/search-standalone.d.ts} +0 -0
- /package/dist/{search-standalone.js → cjs/search-standalone.js} +0 -0
- /package/dist/{search.d.ts → cjs/search.d.ts} +0 -0
- /package/dist/{search.js → cjs/search.js} +0 -0
- /package/dist/{test-utils.d.ts → cjs/test-utils.d.ts} +0 -0
- /package/dist/{test-utils.js → cjs/test-utils.js} +0 -0
- /package/dist/{text → cjs/text}/chunker.d.ts +0 -0
- /package/dist/{text → cjs/text}/chunker.js +0 -0
- /package/dist/{text → cjs/text}/embedder.d.ts +0 -0
- /package/dist/{text → cjs/text}/embedder.js +0 -0
- /package/dist/{text → cjs/text}/index.d.ts +0 -0
- /package/dist/{text → cjs/text}/index.js +0 -0
- /package/dist/{text → cjs/text}/preprocessors/index.d.ts +0 -0
- /package/dist/{text → cjs/text}/preprocessors/index.js +0 -0
- /package/dist/{text → cjs/text}/preprocessors/mdx.d.ts +0 -0
- /package/dist/{text → cjs/text}/preprocessors/mdx.js +0 -0
- /package/dist/{text → cjs/text}/preprocessors/mermaid.d.ts +0 -0
- /package/dist/{text → cjs/text}/preprocessors/mermaid.js +0 -0
- /package/dist/{text → cjs/text}/preprocessors/registry.d.ts +0 -0
- /package/dist/{text → cjs/text}/preprocessors/registry.js +0 -0
- /package/dist/{text → cjs/text}/reranker.d.ts +0 -0
- /package/dist/{text → cjs/text}/reranker.js +0 -0
- /package/dist/{text → cjs/text}/sentence-transformer-embedder.d.ts +0 -0
- /package/dist/{text → cjs/text}/sentence-transformer-embedder.js +0 -0
- /package/dist/{text → cjs/text}/tokenizer.d.ts +0 -0
- /package/dist/{text → cjs/text}/tokenizer.js +0 -0
- /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
- /package/dist/{types.js → cjs/types.js} +0 -0
- /package/dist/{utils → cjs/utils}/vector-math.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/vector-math.js +0 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Cleanup Manager - Handles cleanup of temporary files and buffers for failed operations
|
|
3
|
+
* Implements task 8.2: Add resource cleanup for failed operations
|
|
4
|
+
* Requirements: 8.2, 8.4, 9.4
|
|
5
|
+
*/
|
|
6
|
+
import { DatabaseConnection } from './db.js';
|
|
7
|
+
/**
|
|
8
|
+
* Resource that needs cleanup
|
|
9
|
+
*/
|
|
10
|
+
export interface CleanupResource {
|
|
11
|
+
type: 'file' | 'directory' | 'database_entry' | 'buffer';
|
|
12
|
+
path?: string;
|
|
13
|
+
contentId?: string;
|
|
14
|
+
buffer?: Buffer;
|
|
15
|
+
cleanup: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Transaction context for content operations
|
|
19
|
+
*/
|
|
20
|
+
export interface ContentTransaction {
|
|
21
|
+
id: string;
|
|
22
|
+
resources: CleanupResource[];
|
|
23
|
+
isCommitted: boolean;
|
|
24
|
+
isRolledBack: boolean;
|
|
25
|
+
startTime: Date;
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resource cleanup manager for content operations
|
|
30
|
+
*/
|
|
31
|
+
export declare class ResourceCleanupManager {
|
|
32
|
+
private activeTransactions;
|
|
33
|
+
private cleanupTimeouts;
|
|
34
|
+
/**
|
|
35
|
+
* Start a new transaction for content operations
|
|
36
|
+
* @param timeoutMs - Optional timeout in milliseconds
|
|
37
|
+
* @returns Transaction ID
|
|
38
|
+
*/
|
|
39
|
+
startTransaction(timeoutMs?: number): string;
|
|
40
|
+
/**
|
|
41
|
+
* Add a resource to be tracked for cleanup
|
|
42
|
+
* @param transactionId - Transaction ID
|
|
43
|
+
* @param resource - Resource to track
|
|
44
|
+
*/
|
|
45
|
+
addResource(transactionId: string, resource: CleanupResource): void;
|
|
46
|
+
/**
|
|
47
|
+
* Add a temporary file to be tracked for cleanup
|
|
48
|
+
* @param transactionId - Transaction ID
|
|
49
|
+
* @param filePath - Path to temporary file
|
|
50
|
+
*/
|
|
51
|
+
addTempFile(transactionId: string, filePath: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Add a database entry to be tracked for cleanup
|
|
54
|
+
* @param transactionId - Transaction ID
|
|
55
|
+
* @param db - Database connection
|
|
56
|
+
* @param contentId - Content ID to delete
|
|
57
|
+
*/
|
|
58
|
+
addDatabaseEntry(transactionId: string, db: DatabaseConnection, contentId: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Add a buffer to be tracked for cleanup (memory management)
|
|
61
|
+
* @param transactionId - Transaction ID
|
|
62
|
+
* @param buffer - Buffer to clear
|
|
63
|
+
*/
|
|
64
|
+
addBuffer(transactionId: string, buffer: Buffer): void;
|
|
65
|
+
/**
|
|
66
|
+
* Commit a transaction - resources will not be cleaned up
|
|
67
|
+
* @param transactionId - Transaction ID
|
|
68
|
+
*/
|
|
69
|
+
commitTransaction(transactionId: string): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Rollback a transaction - cleanup all tracked resources
|
|
72
|
+
* @param transactionId - Transaction ID
|
|
73
|
+
* @param reason - Reason for rollback
|
|
74
|
+
*/
|
|
75
|
+
rollbackTransaction(transactionId: string, reason?: string): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Get transaction status
|
|
78
|
+
* @param transactionId - Transaction ID
|
|
79
|
+
* @returns Transaction status or null if not found
|
|
80
|
+
*/
|
|
81
|
+
getTransactionStatus(transactionId: string): {
|
|
82
|
+
id: string;
|
|
83
|
+
resourceCount: number;
|
|
84
|
+
isCommitted: boolean;
|
|
85
|
+
isRolledBack: boolean;
|
|
86
|
+
startTime: Date;
|
|
87
|
+
duration: number;
|
|
88
|
+
timeoutMs?: number;
|
|
89
|
+
} | null;
|
|
90
|
+
/**
|
|
91
|
+
* Cleanup all active transactions (emergency cleanup)
|
|
92
|
+
*/
|
|
93
|
+
cleanupAllTransactions(): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Get statistics about active transactions
|
|
96
|
+
*/
|
|
97
|
+
getStatistics(): {
|
|
98
|
+
activeTransactions: number;
|
|
99
|
+
totalResources: number;
|
|
100
|
+
oldestTransactionAge: number | null;
|
|
101
|
+
transactionsWithTimeout: number;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Generate a unique transaction ID
|
|
105
|
+
*/
|
|
106
|
+
private generateTransactionId;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Global resource cleanup manager instance
|
|
110
|
+
*/
|
|
111
|
+
export declare const globalResourceCleanup: ResourceCleanupManager;
|
|
112
|
+
/**
|
|
113
|
+
* Utility function to execute an operation with automatic resource cleanup
|
|
114
|
+
* @param operation - Operation to execute
|
|
115
|
+
* @param timeoutMs - Optional timeout in milliseconds
|
|
116
|
+
* @returns Promise that resolves to operation result
|
|
117
|
+
*/
|
|
118
|
+
export declare function withResourceCleanup<T>(operation: (transactionId: string) => Promise<T>, timeoutMs?: number): Promise<T>;
|
|
119
|
+
/**
|
|
120
|
+
* Utility function for atomic file operations with cleanup
|
|
121
|
+
* @param filePath - Target file path
|
|
122
|
+
* @param content - Content to write
|
|
123
|
+
* @param transactionId - Transaction ID for cleanup tracking
|
|
124
|
+
*/
|
|
125
|
+
export declare function writeFileAtomic(filePath: string, content: Buffer, transactionId: string): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Timeout wrapper for operations
|
|
128
|
+
* @param operation - Operation to execute
|
|
129
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
130
|
+
* @param timeoutMessage - Message for timeout error
|
|
131
|
+
* @returns Promise that resolves to operation result or rejects on timeout
|
|
132
|
+
*/
|
|
133
|
+
export declare function withTimeout<T>(operation: Promise<T>, timeoutMs: number, timeoutMessage?: string): Promise<T>;
|
|
134
|
+
/**
|
|
135
|
+
* Memory-safe buffer operations
|
|
136
|
+
*/
|
|
137
|
+
export declare class SafeBuffer {
|
|
138
|
+
private buffer;
|
|
139
|
+
private originalBuffer;
|
|
140
|
+
private isCleared;
|
|
141
|
+
private clearOriginal;
|
|
142
|
+
constructor(size: number | Buffer, options?: {
|
|
143
|
+
clearOriginal?: boolean;
|
|
144
|
+
});
|
|
145
|
+
/**
|
|
146
|
+
* Get the buffer (throws if cleared)
|
|
147
|
+
*/
|
|
148
|
+
get(): Buffer;
|
|
149
|
+
/**
|
|
150
|
+
* Clear the buffer securely
|
|
151
|
+
* This clears the internal copy and optionally the original buffer for security
|
|
152
|
+
*/
|
|
153
|
+
clear(): void;
|
|
154
|
+
/**
|
|
155
|
+
* Get buffer size
|
|
156
|
+
*/
|
|
157
|
+
size(): number;
|
|
158
|
+
/**
|
|
159
|
+
* Check if buffer is cleared
|
|
160
|
+
*/
|
|
161
|
+
isBufferCleared(): boolean;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=resource-cleanup.d.ts.map
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Cleanup Manager - Handles cleanup of temporary files and buffers for failed operations
|
|
3
|
+
* Implements task 8.2: Add resource cleanup for failed operations
|
|
4
|
+
* Requirements: 8.2, 8.4, 9.4
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import { dirname } from 'path';
|
|
8
|
+
import { deleteContentMetadata } from './db.js';
|
|
9
|
+
import { ContentDirectoryError } from './content-errors.js';
|
|
10
|
+
/**
|
|
11
|
+
* Resource cleanup manager for content operations
|
|
12
|
+
*/
|
|
13
|
+
export class ResourceCleanupManager {
|
|
14
|
+
activeTransactions = new Map();
|
|
15
|
+
cleanupTimeouts = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* Start a new transaction for content operations
|
|
18
|
+
* @param timeoutMs - Optional timeout in milliseconds
|
|
19
|
+
* @returns Transaction ID
|
|
20
|
+
*/
|
|
21
|
+
startTransaction(timeoutMs) {
|
|
22
|
+
const transactionId = this.generateTransactionId();
|
|
23
|
+
const transaction = {
|
|
24
|
+
id: transactionId,
|
|
25
|
+
resources: [],
|
|
26
|
+
isCommitted: false,
|
|
27
|
+
isRolledBack: false,
|
|
28
|
+
startTime: new Date(),
|
|
29
|
+
timeoutMs
|
|
30
|
+
};
|
|
31
|
+
this.activeTransactions.set(transactionId, transaction);
|
|
32
|
+
// Set up timeout if specified
|
|
33
|
+
if (timeoutMs) {
|
|
34
|
+
const timeout = setTimeout(async () => {
|
|
35
|
+
await this.rollbackTransaction(transactionId, 'Transaction timeout');
|
|
36
|
+
}, timeoutMs);
|
|
37
|
+
this.cleanupTimeouts.set(transactionId, timeout);
|
|
38
|
+
}
|
|
39
|
+
return transactionId;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Add a resource to be tracked for cleanup
|
|
43
|
+
* @param transactionId - Transaction ID
|
|
44
|
+
* @param resource - Resource to track
|
|
45
|
+
*/
|
|
46
|
+
addResource(transactionId, resource) {
|
|
47
|
+
const transaction = this.activeTransactions.get(transactionId);
|
|
48
|
+
if (!transaction) {
|
|
49
|
+
throw new Error(`Transaction not found: ${transactionId}`);
|
|
50
|
+
}
|
|
51
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
52
|
+
throw new Error(`Transaction ${transactionId} is already finalized`);
|
|
53
|
+
}
|
|
54
|
+
transaction.resources.push(resource);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Add a temporary file to be tracked for cleanup
|
|
58
|
+
* @param transactionId - Transaction ID
|
|
59
|
+
* @param filePath - Path to temporary file
|
|
60
|
+
*/
|
|
61
|
+
addTempFile(transactionId, filePath) {
|
|
62
|
+
this.addResource(transactionId, {
|
|
63
|
+
type: 'file',
|
|
64
|
+
path: filePath,
|
|
65
|
+
cleanup: async () => {
|
|
66
|
+
try {
|
|
67
|
+
await fs.unlink(filePath);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
// Ignore file not found errors
|
|
71
|
+
if (error.code !== 'ENOENT') {
|
|
72
|
+
console.warn(`Failed to cleanup temp file ${filePath}:`, error);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Add a database entry to be tracked for cleanup
|
|
80
|
+
* @param transactionId - Transaction ID
|
|
81
|
+
* @param db - Database connection
|
|
82
|
+
* @param contentId - Content ID to delete
|
|
83
|
+
*/
|
|
84
|
+
addDatabaseEntry(transactionId, db, contentId) {
|
|
85
|
+
this.addResource(transactionId, {
|
|
86
|
+
type: 'database_entry',
|
|
87
|
+
contentId,
|
|
88
|
+
cleanup: async () => {
|
|
89
|
+
try {
|
|
90
|
+
await deleteContentMetadata(db, contentId);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.warn(`Failed to cleanup database entry ${contentId}:`, error);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Add a buffer to be tracked for cleanup (memory management)
|
|
100
|
+
* @param transactionId - Transaction ID
|
|
101
|
+
* @param buffer - Buffer to clear
|
|
102
|
+
*/
|
|
103
|
+
addBuffer(transactionId, buffer) {
|
|
104
|
+
this.addResource(transactionId, {
|
|
105
|
+
type: 'buffer',
|
|
106
|
+
buffer,
|
|
107
|
+
cleanup: async () => {
|
|
108
|
+
try {
|
|
109
|
+
// Clear buffer contents for security
|
|
110
|
+
buffer.fill(0);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.warn('Failed to clear buffer:', error);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Commit a transaction - resources will not be cleaned up
|
|
120
|
+
* @param transactionId - Transaction ID
|
|
121
|
+
*/
|
|
122
|
+
async commitTransaction(transactionId) {
|
|
123
|
+
const transaction = this.activeTransactions.get(transactionId);
|
|
124
|
+
if (!transaction) {
|
|
125
|
+
throw new Error(`Transaction not found: ${transactionId}`);
|
|
126
|
+
}
|
|
127
|
+
if (transaction.isRolledBack) {
|
|
128
|
+
throw new Error(`Transaction ${transactionId} was already rolled back`);
|
|
129
|
+
}
|
|
130
|
+
transaction.isCommitted = true;
|
|
131
|
+
// Clear timeout
|
|
132
|
+
const timeout = this.cleanupTimeouts.get(transactionId);
|
|
133
|
+
if (timeout) {
|
|
134
|
+
clearTimeout(timeout);
|
|
135
|
+
this.cleanupTimeouts.delete(transactionId);
|
|
136
|
+
}
|
|
137
|
+
// Remove from active transactions
|
|
138
|
+
this.activeTransactions.delete(transactionId);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Rollback a transaction - cleanup all tracked resources
|
|
142
|
+
* @param transactionId - Transaction ID
|
|
143
|
+
* @param reason - Reason for rollback
|
|
144
|
+
*/
|
|
145
|
+
async rollbackTransaction(transactionId, reason) {
|
|
146
|
+
const transaction = this.activeTransactions.get(transactionId);
|
|
147
|
+
if (!transaction) {
|
|
148
|
+
// Transaction might have already been cleaned up
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (transaction.isCommitted) {
|
|
152
|
+
throw new Error(`Transaction ${transactionId} was already committed`);
|
|
153
|
+
}
|
|
154
|
+
transaction.isRolledBack = true;
|
|
155
|
+
// Clear timeout
|
|
156
|
+
const timeout = this.cleanupTimeouts.get(transactionId);
|
|
157
|
+
if (timeout) {
|
|
158
|
+
clearTimeout(timeout);
|
|
159
|
+
this.cleanupTimeouts.delete(transactionId);
|
|
160
|
+
}
|
|
161
|
+
// Cleanup all resources
|
|
162
|
+
const cleanupPromises = transaction.resources.map(async (resource) => {
|
|
163
|
+
try {
|
|
164
|
+
await resource.cleanup();
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.warn(`Failed to cleanup resource ${resource.type}:`, error);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
await Promise.allSettled(cleanupPromises);
|
|
171
|
+
// Remove from active transactions
|
|
172
|
+
this.activeTransactions.delete(transactionId);
|
|
173
|
+
if (reason) {
|
|
174
|
+
console.warn(`Transaction ${transactionId} rolled back: ${reason}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get transaction status
|
|
179
|
+
* @param transactionId - Transaction ID
|
|
180
|
+
* @returns Transaction status or null if not found
|
|
181
|
+
*/
|
|
182
|
+
getTransactionStatus(transactionId) {
|
|
183
|
+
const transaction = this.activeTransactions.get(transactionId);
|
|
184
|
+
if (!transaction) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
id: transaction.id,
|
|
189
|
+
resourceCount: transaction.resources.length,
|
|
190
|
+
isCommitted: transaction.isCommitted,
|
|
191
|
+
isRolledBack: transaction.isRolledBack,
|
|
192
|
+
startTime: transaction.startTime,
|
|
193
|
+
duration: Date.now() - transaction.startTime.getTime(),
|
|
194
|
+
timeoutMs: transaction.timeoutMs
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Cleanup all active transactions (emergency cleanup)
|
|
199
|
+
*/
|
|
200
|
+
async cleanupAllTransactions() {
|
|
201
|
+
const transactionIds = Array.from(this.activeTransactions.keys());
|
|
202
|
+
const cleanupPromises = transactionIds.map(async (transactionId) => {
|
|
203
|
+
try {
|
|
204
|
+
await this.rollbackTransaction(transactionId, 'Emergency cleanup');
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
console.warn(`Failed to cleanup transaction ${transactionId}:`, error);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
await Promise.allSettled(cleanupPromises);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get statistics about active transactions
|
|
214
|
+
*/
|
|
215
|
+
getStatistics() {
|
|
216
|
+
const transactions = Array.from(this.activeTransactions.values());
|
|
217
|
+
const now = Date.now();
|
|
218
|
+
return {
|
|
219
|
+
activeTransactions: transactions.length,
|
|
220
|
+
totalResources: transactions.reduce((sum, t) => sum + t.resources.length, 0),
|
|
221
|
+
oldestTransactionAge: transactions.length > 0
|
|
222
|
+
? Math.max(...transactions.map(t => now - t.startTime.getTime()))
|
|
223
|
+
: null,
|
|
224
|
+
transactionsWithTimeout: transactions.filter(t => t.timeoutMs).length
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Generate a unique transaction ID
|
|
229
|
+
*/
|
|
230
|
+
generateTransactionId() {
|
|
231
|
+
return `tx_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Global resource cleanup manager instance
|
|
236
|
+
*/
|
|
237
|
+
export const globalResourceCleanup = new ResourceCleanupManager();
|
|
238
|
+
/**
|
|
239
|
+
* Utility function to execute an operation with automatic resource cleanup
|
|
240
|
+
* @param operation - Operation to execute
|
|
241
|
+
* @param timeoutMs - Optional timeout in milliseconds
|
|
242
|
+
* @returns Promise that resolves to operation result
|
|
243
|
+
*/
|
|
244
|
+
export async function withResourceCleanup(operation, timeoutMs) {
|
|
245
|
+
const transactionId = globalResourceCleanup.startTransaction(timeoutMs);
|
|
246
|
+
try {
|
|
247
|
+
const result = await operation(transactionId);
|
|
248
|
+
await globalResourceCleanup.commitTransaction(transactionId);
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
await globalResourceCleanup.rollbackTransaction(transactionId, `Operation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Utility function for atomic file operations with cleanup
|
|
258
|
+
* @param filePath - Target file path
|
|
259
|
+
* @param content - Content to write
|
|
260
|
+
* @param transactionId - Transaction ID for cleanup tracking
|
|
261
|
+
*/
|
|
262
|
+
export async function writeFileAtomic(filePath, content, transactionId) {
|
|
263
|
+
const tempPath = `${filePath}.tmp.${Date.now()}`;
|
|
264
|
+
// Track temp file for cleanup
|
|
265
|
+
globalResourceCleanup.addTempFile(transactionId, tempPath);
|
|
266
|
+
try {
|
|
267
|
+
// Ensure directory exists
|
|
268
|
+
await fs.mkdir(dirname(filePath), { recursive: true });
|
|
269
|
+
// Write to temporary file
|
|
270
|
+
await fs.writeFile(tempPath, content);
|
|
271
|
+
// Atomically move to final location
|
|
272
|
+
await fs.rename(tempPath, filePath);
|
|
273
|
+
// Remove temp file from cleanup list since it was successfully moved
|
|
274
|
+
const transaction = globalResourceCleanup.getTransactionStatus(transactionId);
|
|
275
|
+
if (transaction) {
|
|
276
|
+
// Remove the temp file resource since it's now the final file
|
|
277
|
+
const activeTransaction = globalResourceCleanup.activeTransactions.get(transactionId);
|
|
278
|
+
if (activeTransaction) {
|
|
279
|
+
activeTransaction.resources = activeTransaction.resources.filter((r) => r.path !== tempPath);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
// Temp file will be cleaned up automatically by transaction rollback
|
|
285
|
+
throw new ContentDirectoryError('atomic write', `Failed to write file atomically: ${error instanceof Error ? error.message : 'Unknown error'}`, 'file_write');
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Timeout wrapper for operations
|
|
290
|
+
* @param operation - Operation to execute
|
|
291
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
292
|
+
* @param timeoutMessage - Message for timeout error
|
|
293
|
+
* @returns Promise that resolves to operation result or rejects on timeout
|
|
294
|
+
*/
|
|
295
|
+
export function withTimeout(operation, timeoutMs, timeoutMessage = 'Operation timed out') {
|
|
296
|
+
let timeoutHandle;
|
|
297
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
298
|
+
timeoutHandle = setTimeout(() => {
|
|
299
|
+
reject(new Error(`${timeoutMessage} (${timeoutMs}ms)`));
|
|
300
|
+
}, timeoutMs);
|
|
301
|
+
});
|
|
302
|
+
return Promise.race([
|
|
303
|
+
operation.finally(() => {
|
|
304
|
+
// Clear timeout when operation completes (success or failure)
|
|
305
|
+
if (timeoutHandle) {
|
|
306
|
+
clearTimeout(timeoutHandle);
|
|
307
|
+
}
|
|
308
|
+
}),
|
|
309
|
+
timeoutPromise
|
|
310
|
+
]);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Memory-safe buffer operations
|
|
314
|
+
*/
|
|
315
|
+
export class SafeBuffer {
|
|
316
|
+
buffer;
|
|
317
|
+
originalBuffer = null;
|
|
318
|
+
isCleared = false;
|
|
319
|
+
clearOriginal;
|
|
320
|
+
constructor(size, options = {}) {
|
|
321
|
+
this.clearOriginal = options.clearOriginal ?? true; // Default to true for security
|
|
322
|
+
if (typeof size === 'number') {
|
|
323
|
+
this.buffer = Buffer.allocUnsafe(size);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
// Store reference to original buffer for secure clearing (if requested)
|
|
327
|
+
if (this.clearOriginal) {
|
|
328
|
+
this.originalBuffer = size;
|
|
329
|
+
}
|
|
330
|
+
// Create a copy of the buffer to avoid modifying the original during normal operations
|
|
331
|
+
this.buffer = Buffer.from(size);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get the buffer (throws if cleared)
|
|
336
|
+
*/
|
|
337
|
+
get() {
|
|
338
|
+
if (this.isCleared) {
|
|
339
|
+
throw new Error('Buffer has been cleared');
|
|
340
|
+
}
|
|
341
|
+
return this.buffer;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Clear the buffer securely
|
|
345
|
+
* This clears the internal copy and optionally the original buffer for security
|
|
346
|
+
*/
|
|
347
|
+
clear() {
|
|
348
|
+
if (!this.isCleared) {
|
|
349
|
+
// Clear the internal buffer
|
|
350
|
+
this.buffer.fill(0);
|
|
351
|
+
// Also clear the original buffer for security (if requested and it exists)
|
|
352
|
+
if (this.clearOriginal && this.originalBuffer) {
|
|
353
|
+
this.originalBuffer.fill(0);
|
|
354
|
+
}
|
|
355
|
+
this.isCleared = true;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Get buffer size
|
|
360
|
+
*/
|
|
361
|
+
size() {
|
|
362
|
+
return this.buffer.length;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Check if buffer is cleared
|
|
366
|
+
*/
|
|
367
|
+
isBufferCleared() {
|
|
368
|
+
return this.isCleared;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=resource-cleanup.js.map
|