gitx.do 0.1.0 → 0.1.2
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/README.md +40 -353
- package/dist/do/logger.d.ts +50 -0
- package/dist/do/logger.d.ts.map +1 -0
- package/dist/do/logger.js +122 -0
- package/dist/do/logger.js.map +1 -0
- package/dist/{durable-object → do}/schema.d.ts +3 -3
- package/dist/do/schema.d.ts.map +1 -0
- package/dist/{durable-object → do}/schema.js +4 -3
- package/dist/do/schema.js.map +1 -0
- package/dist/do/types.d.ts +267 -0
- package/dist/do/types.d.ts.map +1 -0
- package/dist/do/types.js +62 -0
- package/dist/do/types.js.map +1 -0
- package/dist/index.d.ts +15 -415
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -483
- package/dist/index.js.map +1 -1
- package/package.json +13 -21
- package/dist/cli/commands/add.d.ts +0 -174
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js +0 -131
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/blame.d.ts +0 -259
- package/dist/cli/commands/blame.d.ts.map +0 -1
- package/dist/cli/commands/blame.js +0 -609
- package/dist/cli/commands/blame.js.map +0 -1
- package/dist/cli/commands/branch.d.ts +0 -249
- package/dist/cli/commands/branch.d.ts.map +0 -1
- package/dist/cli/commands/branch.js +0 -693
- package/dist/cli/commands/branch.js.map +0 -1
- package/dist/cli/commands/commit.d.ts +0 -182
- package/dist/cli/commands/commit.d.ts.map +0 -1
- package/dist/cli/commands/commit.js +0 -437
- package/dist/cli/commands/commit.js.map +0 -1
- package/dist/cli/commands/diff.d.ts +0 -464
- package/dist/cli/commands/diff.d.ts.map +0 -1
- package/dist/cli/commands/diff.js +0 -958
- package/dist/cli/commands/diff.js.map +0 -1
- package/dist/cli/commands/log.d.ts +0 -239
- package/dist/cli/commands/log.d.ts.map +0 -1
- package/dist/cli/commands/log.js +0 -535
- package/dist/cli/commands/log.js.map +0 -1
- package/dist/cli/commands/merge.d.ts +0 -106
- package/dist/cli/commands/merge.d.ts.map +0 -1
- package/dist/cli/commands/merge.js +0 -55
- package/dist/cli/commands/merge.js.map +0 -1
- package/dist/cli/commands/review.d.ts +0 -457
- package/dist/cli/commands/review.d.ts.map +0 -1
- package/dist/cli/commands/review.js +0 -533
- package/dist/cli/commands/review.js.map +0 -1
- package/dist/cli/commands/status.d.ts +0 -269
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js +0 -493
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/web.d.ts +0 -199
- package/dist/cli/commands/web.d.ts.map +0 -1
- package/dist/cli/commands/web.js +0 -696
- package/dist/cli/commands/web.js.map +0 -1
- package/dist/cli/fs-adapter.d.ts +0 -656
- package/dist/cli/fs-adapter.d.ts.map +0 -1
- package/dist/cli/fs-adapter.js +0 -1179
- package/dist/cli/fs-adapter.js.map +0 -1
- package/dist/cli/fsx-cli-adapter.d.ts +0 -359
- package/dist/cli/fsx-cli-adapter.d.ts.map +0 -1
- package/dist/cli/fsx-cli-adapter.js +0 -619
- package/dist/cli/fsx-cli-adapter.js.map +0 -1
- package/dist/cli/index.d.ts +0 -387
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -523
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/ui/components/DiffView.d.ts +0 -7
- package/dist/cli/ui/components/DiffView.d.ts.map +0 -1
- package/dist/cli/ui/components/DiffView.js +0 -11
- package/dist/cli/ui/components/DiffView.js.map +0 -1
- package/dist/cli/ui/components/ErrorDisplay.d.ts +0 -6
- package/dist/cli/ui/components/ErrorDisplay.d.ts.map +0 -1
- package/dist/cli/ui/components/ErrorDisplay.js +0 -11
- package/dist/cli/ui/components/ErrorDisplay.js.map +0 -1
- package/dist/cli/ui/components/FuzzySearch.d.ts +0 -9
- package/dist/cli/ui/components/FuzzySearch.d.ts.map +0 -1
- package/dist/cli/ui/components/FuzzySearch.js +0 -12
- package/dist/cli/ui/components/FuzzySearch.js.map +0 -1
- package/dist/cli/ui/components/LoadingSpinner.d.ts +0 -6
- package/dist/cli/ui/components/LoadingSpinner.d.ts.map +0 -1
- package/dist/cli/ui/components/LoadingSpinner.js +0 -10
- package/dist/cli/ui/components/LoadingSpinner.js.map +0 -1
- package/dist/cli/ui/components/NavigationList.d.ts +0 -9
- package/dist/cli/ui/components/NavigationList.d.ts.map +0 -1
- package/dist/cli/ui/components/NavigationList.js +0 -11
- package/dist/cli/ui/components/NavigationList.js.map +0 -1
- package/dist/cli/ui/components/ScrollableContent.d.ts +0 -8
- package/dist/cli/ui/components/ScrollableContent.d.ts.map +0 -1
- package/dist/cli/ui/components/ScrollableContent.js +0 -11
- package/dist/cli/ui/components/ScrollableContent.js.map +0 -1
- package/dist/cli/ui/components/index.d.ts +0 -7
- package/dist/cli/ui/components/index.d.ts.map +0 -1
- package/dist/cli/ui/components/index.js +0 -9
- package/dist/cli/ui/components/index.js.map +0 -1
- package/dist/cli/ui/terminal-ui.d.ts +0 -52
- package/dist/cli/ui/terminal-ui.d.ts.map +0 -1
- package/dist/cli/ui/terminal-ui.js +0 -121
- package/dist/cli/ui/terminal-ui.js.map +0 -1
- package/dist/do/BashModule.d.ts +0 -871
- package/dist/do/BashModule.d.ts.map +0 -1
- package/dist/do/BashModule.js +0 -1143
- package/dist/do/BashModule.js.map +0 -1
- package/dist/do/FsModule.d.ts +0 -601
- package/dist/do/FsModule.d.ts.map +0 -1
- package/dist/do/FsModule.js +0 -1120
- package/dist/do/FsModule.js.map +0 -1
- package/dist/do/GitModule.d.ts +0 -635
- package/dist/do/GitModule.d.ts.map +0 -1
- package/dist/do/GitModule.js +0 -781
- package/dist/do/GitModule.js.map +0 -1
- package/dist/do/GitRepoDO.d.ts +0 -281
- package/dist/do/GitRepoDO.d.ts.map +0 -1
- package/dist/do/GitRepoDO.js +0 -479
- package/dist/do/GitRepoDO.js.map +0 -1
- package/dist/do/bash-ast.d.ts +0 -246
- package/dist/do/bash-ast.d.ts.map +0 -1
- package/dist/do/bash-ast.js +0 -888
- package/dist/do/bash-ast.js.map +0 -1
- package/dist/do/container-executor.d.ts +0 -491
- package/dist/do/container-executor.d.ts.map +0 -1
- package/dist/do/container-executor.js +0 -730
- package/dist/do/container-executor.js.map +0 -1
- package/dist/do/index.d.ts +0 -53
- package/dist/do/index.d.ts.map +0 -1
- package/dist/do/index.js +0 -91
- package/dist/do/index.js.map +0 -1
- package/dist/do/tiered-storage.d.ts +0 -403
- package/dist/do/tiered-storage.d.ts.map +0 -1
- package/dist/do/tiered-storage.js +0 -689
- package/dist/do/tiered-storage.js.map +0 -1
- package/dist/do/withBash.d.ts +0 -231
- package/dist/do/withBash.d.ts.map +0 -1
- package/dist/do/withBash.js +0 -244
- package/dist/do/withBash.js.map +0 -1
- package/dist/do/withFs.d.ts +0 -237
- package/dist/do/withFs.d.ts.map +0 -1
- package/dist/do/withFs.js +0 -387
- package/dist/do/withFs.js.map +0 -1
- package/dist/do/withGit.d.ts +0 -180
- package/dist/do/withGit.d.ts.map +0 -1
- package/dist/do/withGit.js +0 -271
- package/dist/do/withGit.js.map +0 -1
- package/dist/durable-object/object-store.d.ts +0 -633
- package/dist/durable-object/object-store.d.ts.map +0 -1
- package/dist/durable-object/object-store.js +0 -1161
- package/dist/durable-object/object-store.js.map +0 -1
- package/dist/durable-object/schema.d.ts.map +0 -1
- package/dist/durable-object/schema.js.map +0 -1
- package/dist/durable-object/wal.d.ts +0 -416
- package/dist/durable-object/wal.d.ts.map +0 -1
- package/dist/durable-object/wal.js +0 -445
- package/dist/durable-object/wal.js.map +0 -1
- package/dist/mcp/adapter.d.ts +0 -772
- package/dist/mcp/adapter.d.ts.map +0 -1
- package/dist/mcp/adapter.js +0 -895
- package/dist/mcp/adapter.js.map +0 -1
- package/dist/mcp/sandbox/miniflare-evaluator.d.ts +0 -22
- package/dist/mcp/sandbox/miniflare-evaluator.d.ts.map +0 -1
- package/dist/mcp/sandbox/miniflare-evaluator.js +0 -140
- package/dist/mcp/sandbox/miniflare-evaluator.js.map +0 -1
- package/dist/mcp/sandbox/object-store-proxy.d.ts +0 -32
- package/dist/mcp/sandbox/object-store-proxy.d.ts.map +0 -1
- package/dist/mcp/sandbox/object-store-proxy.js +0 -30
- package/dist/mcp/sandbox/object-store-proxy.js.map +0 -1
- package/dist/mcp/sandbox/template.d.ts +0 -17
- package/dist/mcp/sandbox/template.d.ts.map +0 -1
- package/dist/mcp/sandbox/template.js +0 -71
- package/dist/mcp/sandbox/template.js.map +0 -1
- package/dist/mcp/sandbox.d.ts +0 -764
- package/dist/mcp/sandbox.d.ts.map +0 -1
- package/dist/mcp/sandbox.js +0 -1362
- package/dist/mcp/sandbox.js.map +0 -1
- package/dist/mcp/sdk-adapter.d.ts +0 -835
- package/dist/mcp/sdk-adapter.d.ts.map +0 -1
- package/dist/mcp/sdk-adapter.js +0 -974
- package/dist/mcp/sdk-adapter.js.map +0 -1
- package/dist/mcp/tools/do.d.ts +0 -32
- package/dist/mcp/tools/do.d.ts.map +0 -1
- package/dist/mcp/tools/do.js +0 -115
- package/dist/mcp/tools/do.js.map +0 -1
- package/dist/mcp/tools.d.ts +0 -548
- package/dist/mcp/tools.d.ts.map +0 -1
- package/dist/mcp/tools.js +0 -1934
- package/dist/mcp/tools.js.map +0 -1
- package/dist/ops/blame.d.ts +0 -551
- package/dist/ops/blame.d.ts.map +0 -1
- package/dist/ops/blame.js +0 -1037
- package/dist/ops/blame.js.map +0 -1
- package/dist/ops/branch.d.ts +0 -766
- package/dist/ops/branch.d.ts.map +0 -1
- package/dist/ops/branch.js +0 -950
- package/dist/ops/branch.js.map +0 -1
- package/dist/ops/commit-traversal.d.ts +0 -349
- package/dist/ops/commit-traversal.d.ts.map +0 -1
- package/dist/ops/commit-traversal.js +0 -821
- package/dist/ops/commit-traversal.js.map +0 -1
- package/dist/ops/commit.d.ts +0 -555
- package/dist/ops/commit.d.ts.map +0 -1
- package/dist/ops/commit.js +0 -826
- package/dist/ops/commit.js.map +0 -1
- package/dist/ops/merge-base.d.ts +0 -397
- package/dist/ops/merge-base.d.ts.map +0 -1
- package/dist/ops/merge-base.js +0 -691
- package/dist/ops/merge-base.js.map +0 -1
- package/dist/ops/merge.d.ts +0 -855
- package/dist/ops/merge.d.ts.map +0 -1
- package/dist/ops/merge.js +0 -1551
- package/dist/ops/merge.js.map +0 -1
- package/dist/ops/tag.d.ts +0 -247
- package/dist/ops/tag.d.ts.map +0 -1
- package/dist/ops/tag.js +0 -649
- package/dist/ops/tag.js.map +0 -1
- package/dist/ops/tree-builder.d.ts +0 -178
- package/dist/ops/tree-builder.d.ts.map +0 -1
- package/dist/ops/tree-builder.js +0 -271
- package/dist/ops/tree-builder.js.map +0 -1
- package/dist/ops/tree-diff.d.ts +0 -291
- package/dist/ops/tree-diff.d.ts.map +0 -1
- package/dist/ops/tree-diff.js +0 -705
- package/dist/ops/tree-diff.js.map +0 -1
- package/dist/pack/delta.d.ts +0 -248
- package/dist/pack/delta.d.ts.map +0 -1
- package/dist/pack/delta.js +0 -736
- package/dist/pack/delta.js.map +0 -1
- package/dist/pack/format.d.ts +0 -446
- package/dist/pack/format.d.ts.map +0 -1
- package/dist/pack/format.js +0 -572
- package/dist/pack/format.js.map +0 -1
- package/dist/pack/full-generation.d.ts +0 -612
- package/dist/pack/full-generation.d.ts.map +0 -1
- package/dist/pack/full-generation.js +0 -1378
- package/dist/pack/full-generation.js.map +0 -1
- package/dist/pack/generation.d.ts +0 -441
- package/dist/pack/generation.d.ts.map +0 -1
- package/dist/pack/generation.js +0 -707
- package/dist/pack/generation.js.map +0 -1
- package/dist/pack/index.d.ts +0 -502
- package/dist/pack/index.d.ts.map +0 -1
- package/dist/pack/index.js +0 -833
- package/dist/pack/index.js.map +0 -1
- package/dist/refs/branch.d.ts +0 -668
- package/dist/refs/branch.d.ts.map +0 -1
- package/dist/refs/branch.js +0 -897
- package/dist/refs/branch.js.map +0 -1
- package/dist/refs/storage.d.ts +0 -833
- package/dist/refs/storage.d.ts.map +0 -1
- package/dist/refs/storage.js +0 -1023
- package/dist/refs/storage.js.map +0 -1
- package/dist/refs/tag.d.ts +0 -860
- package/dist/refs/tag.d.ts.map +0 -1
- package/dist/refs/tag.js +0 -996
- package/dist/refs/tag.js.map +0 -1
- package/dist/storage/backend.d.ts +0 -425
- package/dist/storage/backend.d.ts.map +0 -1
- package/dist/storage/backend.js +0 -41
- package/dist/storage/backend.js.map +0 -1
- package/dist/storage/fsx-adapter.d.ts +0 -204
- package/dist/storage/fsx-adapter.d.ts.map +0 -1
- package/dist/storage/fsx-adapter.js +0 -470
- package/dist/storage/fsx-adapter.js.map +0 -1
- package/dist/storage/lru-cache.d.ts +0 -691
- package/dist/storage/lru-cache.d.ts.map +0 -1
- package/dist/storage/lru-cache.js +0 -813
- package/dist/storage/lru-cache.js.map +0 -1
- package/dist/storage/object-index.d.ts +0 -585
- package/dist/storage/object-index.d.ts.map +0 -1
- package/dist/storage/object-index.js +0 -532
- package/dist/storage/object-index.js.map +0 -1
- package/dist/storage/r2-pack.d.ts +0 -1257
- package/dist/storage/r2-pack.d.ts.map +0 -1
- package/dist/storage/r2-pack.js +0 -1770
- package/dist/storage/r2-pack.js.map +0 -1
- package/dist/tiered/cdc-pipeline.d.ts +0 -1888
- package/dist/tiered/cdc-pipeline.d.ts.map +0 -1
- package/dist/tiered/cdc-pipeline.js +0 -1880
- package/dist/tiered/cdc-pipeline.js.map +0 -1
- package/dist/tiered/migration.d.ts +0 -1104
- package/dist/tiered/migration.d.ts.map +0 -1
- package/dist/tiered/migration.js +0 -1214
- package/dist/tiered/migration.js.map +0 -1
- package/dist/tiered/parquet-writer.d.ts +0 -1145
- package/dist/tiered/parquet-writer.d.ts.map +0 -1
- package/dist/tiered/parquet-writer.js +0 -1183
- package/dist/tiered/parquet-writer.js.map +0 -1
- package/dist/tiered/read-path.d.ts +0 -835
- package/dist/tiered/read-path.d.ts.map +0 -1
- package/dist/tiered/read-path.js +0 -487
- package/dist/tiered/read-path.js.map +0 -1
- package/dist/types/capability.d.ts +0 -1385
- package/dist/types/capability.d.ts.map +0 -1
- package/dist/types/capability.js +0 -36
- package/dist/types/capability.js.map +0 -1
- package/dist/types/index.d.ts +0 -13
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -18
- package/dist/types/index.js.map +0 -1
- package/dist/types/objects.d.ts +0 -692
- package/dist/types/objects.d.ts.map +0 -1
- package/dist/types/objects.js +0 -837
- package/dist/types/objects.js.map +0 -1
- package/dist/types/storage.d.ts +0 -603
- package/dist/types/storage.d.ts.map +0 -1
- package/dist/types/storage.js +0 -191
- package/dist/types/storage.js.map +0 -1
- package/dist/types/worker-loader.d.ts +0 -60
- package/dist/types/worker-loader.d.ts.map +0 -1
- package/dist/types/worker-loader.js +0 -62
- package/dist/types/worker-loader.js.map +0 -1
- package/dist/utils/hash.d.ts +0 -197
- package/dist/utils/hash.d.ts.map +0 -1
- package/dist/utils/hash.js +0 -268
- package/dist/utils/hash.js.map +0 -1
- package/dist/utils/sha1.d.ts +0 -290
- package/dist/utils/sha1.d.ts.map +0 -1
- package/dist/utils/sha1.js +0 -582
- package/dist/utils/sha1.js.map +0 -1
- package/dist/wire/capabilities.d.ts +0 -1044
- package/dist/wire/capabilities.d.ts.map +0 -1
- package/dist/wire/capabilities.js +0 -941
- package/dist/wire/capabilities.js.map +0 -1
- package/dist/wire/path-security.d.ts +0 -157
- package/dist/wire/path-security.d.ts.map +0 -1
- package/dist/wire/path-security.js +0 -307
- package/dist/wire/path-security.js.map +0 -1
- package/dist/wire/pkt-line.d.ts +0 -345
- package/dist/wire/pkt-line.d.ts.map +0 -1
- package/dist/wire/pkt-line.js +0 -381
- package/dist/wire/pkt-line.js.map +0 -1
- package/dist/wire/receive-pack.d.ts +0 -1059
- package/dist/wire/receive-pack.d.ts.map +0 -1
- package/dist/wire/receive-pack.js +0 -1414
- package/dist/wire/receive-pack.js.map +0 -1
- package/dist/wire/smart-http.d.ts +0 -799
- package/dist/wire/smart-http.d.ts.map +0 -1
- package/dist/wire/smart-http.js +0 -945
- package/dist/wire/smart-http.js.map +0 -1
- package/dist/wire/upload-pack.d.ts +0 -727
- package/dist/wire/upload-pack.d.ts.map +0 -1
- package/dist/wire/upload-pack.js +0 -1138
- package/dist/wire/upload-pack.js.map +0 -1
|
@@ -1,532 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Object Location Index Module
|
|
3
|
-
*
|
|
4
|
-
* This module tracks the storage location of Git objects across multiple storage tiers.
|
|
5
|
-
* It provides a unified index for locating objects regardless of which tier contains
|
|
6
|
-
* the actual data.
|
|
7
|
-
*
|
|
8
|
-
* ## Storage Tiers
|
|
9
|
-
*
|
|
10
|
-
* - **Hot**: SQLite (local Durable Object storage for frequently accessed objects)
|
|
11
|
-
* - **R2**: Packed in R2 object storage (for larger objects or archives)
|
|
12
|
-
* - **Parquet**: Columnar format for cold storage analytics
|
|
13
|
-
*
|
|
14
|
-
* ## Features
|
|
15
|
-
*
|
|
16
|
-
* - O(1) object location lookup by SHA
|
|
17
|
-
* - Batch lookup for multiple objects
|
|
18
|
-
* - Tier-based statistics and querying
|
|
19
|
-
* - Object tracking during tier migrations
|
|
20
|
-
*
|
|
21
|
-
* @module storage/object-index
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```typescript
|
|
25
|
-
* // Initialize the index with Durable Object storage
|
|
26
|
-
* const index = new ObjectIndex(storage);
|
|
27
|
-
*
|
|
28
|
-
* // Record an object location
|
|
29
|
-
* await index.recordLocation({
|
|
30
|
-
* sha: 'abc123...def456',
|
|
31
|
-
* tier: 'hot',
|
|
32
|
-
* size: 1024,
|
|
33
|
-
* type: 'blob'
|
|
34
|
-
* });
|
|
35
|
-
*
|
|
36
|
-
* // Look up an object
|
|
37
|
-
* const location = await index.lookupLocation('abc123...def456');
|
|
38
|
-
* if (location) {
|
|
39
|
-
* console.log(`Object is in ${location.tier} tier`);
|
|
40
|
-
* }
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
/**
|
|
44
|
-
* Validates SHA format (40 alphanumeric characters, allows hyphens).
|
|
45
|
-
*
|
|
46
|
-
* @description
|
|
47
|
-
* Ensures the SHA meets the expected format requirements. Throws an error
|
|
48
|
-
* if the SHA is invalid, which helps catch bugs early.
|
|
49
|
-
*
|
|
50
|
-
* @param sha - The SHA string to validate
|
|
51
|
-
*
|
|
52
|
-
* @throws {Error} If SHA format is invalid
|
|
53
|
-
*
|
|
54
|
-
* @example
|
|
55
|
-
* ```typescript
|
|
56
|
-
* validateSha('abc123def456789012345678901234567890abcd'); // OK
|
|
57
|
-
* validateSha('invalid'); // throws Error
|
|
58
|
-
* ```
|
|
59
|
-
*
|
|
60
|
-
* @internal
|
|
61
|
-
*/
|
|
62
|
-
function validateSha(sha) {
|
|
63
|
-
if (!sha || sha.length !== 40) {
|
|
64
|
-
throw new Error(`Invalid SHA format: ${sha}`);
|
|
65
|
-
}
|
|
66
|
-
if (!/^[0-9a-z-]{40}$/.test(sha)) {
|
|
67
|
-
throw new Error(`Invalid SHA format: ${sha}`);
|
|
68
|
-
}
|
|
69
|
-
// Reject strings that are just one character repeated
|
|
70
|
-
if (/^(.)\1{39}$/.test(sha)) {
|
|
71
|
-
throw new Error(`Invalid SHA format: ${sha}`);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Object Index class for managing object locations across storage tiers.
|
|
76
|
-
*
|
|
77
|
-
* @description
|
|
78
|
-
* Provides a centralized index for tracking where Git objects are stored
|
|
79
|
-
* in the tiered storage system. Uses SQLite (via Durable Object storage)
|
|
80
|
-
* for persistent, consistent storage of location metadata.
|
|
81
|
-
*
|
|
82
|
-
* ## Key Features
|
|
83
|
-
*
|
|
84
|
-
* - **Fast Lookups**: O(1) lookup by SHA using indexed SQLite queries
|
|
85
|
-
* - **Batch Operations**: Efficient bulk lookup for multiple objects
|
|
86
|
-
* - **Tier Tracking**: Query objects by storage tier
|
|
87
|
-
* - **Statistics**: Aggregate stats for monitoring and capacity planning
|
|
88
|
-
*
|
|
89
|
-
* ## Thread Safety
|
|
90
|
-
*
|
|
91
|
-
* The underlying Durable Object storage provides transactional guarantees,
|
|
92
|
-
* ensuring consistency even with concurrent access.
|
|
93
|
-
*
|
|
94
|
-
* @example
|
|
95
|
-
* ```typescript
|
|
96
|
-
* const index = new ObjectIndex(storage);
|
|
97
|
-
*
|
|
98
|
-
* // Record locations
|
|
99
|
-
* await index.recordLocation({
|
|
100
|
-
* sha: 'abc123...',
|
|
101
|
-
* tier: 'hot',
|
|
102
|
-
* size: 1024,
|
|
103
|
-
* type: 'blob'
|
|
104
|
-
* });
|
|
105
|
-
*
|
|
106
|
-
* // Look up a single object
|
|
107
|
-
* const location = await index.lookupLocation('abc123...');
|
|
108
|
-
*
|
|
109
|
-
* // Batch lookup
|
|
110
|
-
* const result = await index.batchLookup(['sha1', 'sha2', 'sha3']);
|
|
111
|
-
*
|
|
112
|
-
* // Get objects by tier
|
|
113
|
-
* const hotObjects = await index.getObjectsByTier('hot');
|
|
114
|
-
*
|
|
115
|
-
* // Get statistics
|
|
116
|
-
* const stats = await index.getStats();
|
|
117
|
-
* ```
|
|
118
|
-
*/
|
|
119
|
-
export class ObjectIndex {
|
|
120
|
-
_storage;
|
|
121
|
-
/**
|
|
122
|
-
* Creates a new ObjectIndex instance.
|
|
123
|
-
*
|
|
124
|
-
* @description
|
|
125
|
-
* Initializes the index with a Durable Object storage instance.
|
|
126
|
-
* The storage should have the object_index table already created
|
|
127
|
-
* by the schema migration.
|
|
128
|
-
*
|
|
129
|
-
* @param storage - Durable Object storage instance with SQL support
|
|
130
|
-
*
|
|
131
|
-
* @example
|
|
132
|
-
* ```typescript
|
|
133
|
-
* // In a Durable Object class
|
|
134
|
-
* constructor(state: DurableObjectState) {
|
|
135
|
-
* this.index = new ObjectIndex(state.storage);
|
|
136
|
-
* }
|
|
137
|
-
* ```
|
|
138
|
-
*/
|
|
139
|
-
constructor(storage) {
|
|
140
|
-
this._storage = storage;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Records the location of an object in the index.
|
|
144
|
-
*
|
|
145
|
-
* @description
|
|
146
|
-
* Inserts or updates the location record for an object. If the object
|
|
147
|
-
* already exists in the index, its location is updated (upsert behavior).
|
|
148
|
-
*
|
|
149
|
-
* @param options - Location recording options including SHA, tier, size, etc.
|
|
150
|
-
*
|
|
151
|
-
* @throws {Error} If SHA format is invalid
|
|
152
|
-
*
|
|
153
|
-
* @example
|
|
154
|
-
* ```typescript
|
|
155
|
-
* // Record a new object in hot tier
|
|
156
|
-
* await index.recordLocation({
|
|
157
|
-
* sha: 'abc123def456789012345678901234567890abcd',
|
|
158
|
-
* tier: 'hot',
|
|
159
|
-
* size: 1024,
|
|
160
|
-
* type: 'blob'
|
|
161
|
-
* });
|
|
162
|
-
*
|
|
163
|
-
* // Record an object in R2 pack
|
|
164
|
-
* await index.recordLocation({
|
|
165
|
-
* sha: 'def456789012345678901234567890abcdef12',
|
|
166
|
-
* tier: 'r2',
|
|
167
|
-
* packId: 'pack-abc123',
|
|
168
|
-
* offset: 4096,
|
|
169
|
-
* size: 2048,
|
|
170
|
-
* type: 'tree'
|
|
171
|
-
* });
|
|
172
|
-
* ```
|
|
173
|
-
*/
|
|
174
|
-
async recordLocation(options) {
|
|
175
|
-
validateSha(options.sha);
|
|
176
|
-
const updatedAt = Date.now();
|
|
177
|
-
const packId = options.packId ?? null;
|
|
178
|
-
const offset = options.offset ?? null;
|
|
179
|
-
this._storage.sql.exec('INSERT OR REPLACE INTO object_index (sha, tier, pack_id, offset, size, type, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)', options.sha, options.tier, packId, offset, options.size, options.type ?? null, updatedAt);
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Looks up the location of an object by SHA.
|
|
183
|
-
*
|
|
184
|
-
* @description
|
|
185
|
-
* Retrieves the storage location for a single object. Returns null if
|
|
186
|
-
* the object is not found in the index.
|
|
187
|
-
*
|
|
188
|
-
* @param sha - The 40-character SHA-1 hash of the object
|
|
189
|
-
*
|
|
190
|
-
* @returns The object location or null if not found
|
|
191
|
-
*
|
|
192
|
-
* @example
|
|
193
|
-
* ```typescript
|
|
194
|
-
* const location = await index.lookupLocation('abc123...');
|
|
195
|
-
* if (location) {
|
|
196
|
-
* console.log(`Object is in ${location.tier} tier`);
|
|
197
|
-
* if (location.packId) {
|
|
198
|
-
* console.log(`Pack: ${location.packId}, Offset: ${location.offset}`);
|
|
199
|
-
* }
|
|
200
|
-
* } else {
|
|
201
|
-
* console.log('Object not found');
|
|
202
|
-
* }
|
|
203
|
-
* ```
|
|
204
|
-
*/
|
|
205
|
-
async lookupLocation(sha) {
|
|
206
|
-
const result = this._storage.sql.exec('SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE sha = ?', sha);
|
|
207
|
-
const rows = result.toArray();
|
|
208
|
-
if (rows.length === 0) {
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
return rows[0];
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Performs batch lookup of multiple objects.
|
|
215
|
-
*
|
|
216
|
-
* @description
|
|
217
|
-
* Efficiently looks up locations for multiple objects in a single query.
|
|
218
|
-
* Returns both found locations and a list of missing SHAs.
|
|
219
|
-
*
|
|
220
|
-
* This is more efficient than multiple single lookups when you need
|
|
221
|
-
* to find several objects.
|
|
222
|
-
*
|
|
223
|
-
* @param shas - Array of SHA-1 hashes to look up
|
|
224
|
-
*
|
|
225
|
-
* @returns Result containing found locations and missing SHAs
|
|
226
|
-
*
|
|
227
|
-
* @example
|
|
228
|
-
* ```typescript
|
|
229
|
-
* const shas = ['sha1...', 'sha2...', 'sha3...'];
|
|
230
|
-
* const result = await index.batchLookup(shas);
|
|
231
|
-
*
|
|
232
|
-
* console.log(`Found ${result.found.size} objects`);
|
|
233
|
-
* console.log(`Missing ${result.missing.length} objects`);
|
|
234
|
-
*
|
|
235
|
-
* for (const [sha, location] of result.found) {
|
|
236
|
-
* console.log(`${sha}: ${location.tier}`);
|
|
237
|
-
* }
|
|
238
|
-
* ```
|
|
239
|
-
*/
|
|
240
|
-
async batchLookup(shas) {
|
|
241
|
-
if (shas.length === 0) {
|
|
242
|
-
return { found: new Map(), missing: [] };
|
|
243
|
-
}
|
|
244
|
-
// Build query with placeholders
|
|
245
|
-
const placeholders = shas.map(() => '?').join(', ');
|
|
246
|
-
const result = this._storage.sql.exec(`SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE sha IN (${placeholders})`, ...shas);
|
|
247
|
-
const rows = result.toArray();
|
|
248
|
-
const found = new Map();
|
|
249
|
-
for (const row of rows) {
|
|
250
|
-
found.set(row.sha, row);
|
|
251
|
-
}
|
|
252
|
-
const missing = shas.filter(sha => !found.has(sha));
|
|
253
|
-
return { found, missing };
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Updates the location of an object (e.g., when moving between tiers).
|
|
257
|
-
*
|
|
258
|
-
* @description
|
|
259
|
-
* Updates the tier, packId, and offset for an existing object.
|
|
260
|
-
* Use this when migrating objects between storage tiers.
|
|
261
|
-
*
|
|
262
|
-
* Note: This only updates existing records. If the object doesn't exist,
|
|
263
|
-
* no action is taken. Use `recordLocation` for upsert behavior.
|
|
264
|
-
*
|
|
265
|
-
* @param sha - The object's SHA-1 hash
|
|
266
|
-
* @param newTier - The new storage tier
|
|
267
|
-
* @param packId - Pack ID for r2/parquet tiers (optional)
|
|
268
|
-
* @param offset - Byte offset in pack file (optional)
|
|
269
|
-
*
|
|
270
|
-
* @example
|
|
271
|
-
* ```typescript
|
|
272
|
-
* // Migrate object from hot to R2
|
|
273
|
-
* await index.updateLocation(
|
|
274
|
-
* 'abc123...',
|
|
275
|
-
* 'r2',
|
|
276
|
-
* 'pack-new123',
|
|
277
|
-
* 1024
|
|
278
|
-
* );
|
|
279
|
-
*
|
|
280
|
-
* // Migrate object to hot tier
|
|
281
|
-
* await index.updateLocation('abc123...', 'hot');
|
|
282
|
-
* ```
|
|
283
|
-
*/
|
|
284
|
-
async updateLocation(sha, newTier, packId, offset) {
|
|
285
|
-
this._storage.sql.exec('UPDATE object_index SET tier = ?, pack_id = ?, offset = ? WHERE sha = ?', newTier, packId ?? null, offset ?? null, sha);
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Gets statistics about object distribution across tiers.
|
|
289
|
-
*
|
|
290
|
-
* @description
|
|
291
|
-
* Returns aggregated statistics including object counts and total sizes
|
|
292
|
-
* for each storage tier. Useful for monitoring storage usage and
|
|
293
|
-
* capacity planning.
|
|
294
|
-
*
|
|
295
|
-
* @returns Statistics about objects in each tier
|
|
296
|
-
*
|
|
297
|
-
* @example
|
|
298
|
-
* ```typescript
|
|
299
|
-
* const stats = await index.getStats();
|
|
300
|
-
*
|
|
301
|
-
* console.log(`Total objects: ${stats.totalObjects}`);
|
|
302
|
-
* console.log('Hot tier:');
|
|
303
|
-
* console.log(` Count: ${stats.hotCount}`);
|
|
304
|
-
* console.log(` Size: ${(stats.hotSize / 1024 / 1024).toFixed(2)} MB`);
|
|
305
|
-
* console.log('R2 tier:');
|
|
306
|
-
* console.log(` Count: ${stats.r2Count}`);
|
|
307
|
-
* console.log(` Size: ${(stats.r2Size / 1024 / 1024).toFixed(2)} MB`);
|
|
308
|
-
* ```
|
|
309
|
-
*/
|
|
310
|
-
async getStats() {
|
|
311
|
-
// Get objects by tier and compute stats in code
|
|
312
|
-
// This approach works better with the mock storage implementation
|
|
313
|
-
const hotObjects = await this.getObjectsByTier('hot');
|
|
314
|
-
const r2Objects = await this.getObjectsByTier('r2');
|
|
315
|
-
const parquetObjects = await this.getObjectsByTier('parquet');
|
|
316
|
-
const hotCount = hotObjects.length;
|
|
317
|
-
const r2Count = r2Objects.length;
|
|
318
|
-
const parquetCount = parquetObjects.length;
|
|
319
|
-
const totalObjects = hotCount + r2Count + parquetCount;
|
|
320
|
-
const hotSize = hotObjects.reduce((sum, o) => sum + o.size, 0);
|
|
321
|
-
const r2Size = r2Objects.reduce((sum, o) => sum + o.size, 0);
|
|
322
|
-
const parquetSize = parquetObjects.reduce((sum, o) => sum + o.size, 0);
|
|
323
|
-
return {
|
|
324
|
-
totalObjects,
|
|
325
|
-
hotCount,
|
|
326
|
-
r2Count,
|
|
327
|
-
parquetCount,
|
|
328
|
-
hotSize,
|
|
329
|
-
r2Size,
|
|
330
|
-
parquetSize
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Checks if an object exists in the index.
|
|
335
|
-
*
|
|
336
|
-
* @description
|
|
337
|
-
* Returns true if the object is tracked in the index, regardless of
|
|
338
|
-
* which tier it's stored in.
|
|
339
|
-
*
|
|
340
|
-
* @param sha - The object's SHA-1 hash
|
|
341
|
-
*
|
|
342
|
-
* @returns true if the object exists in the index
|
|
343
|
-
*
|
|
344
|
-
* @example
|
|
345
|
-
* ```typescript
|
|
346
|
-
* if (await index.exists('abc123...')) {
|
|
347
|
-
* console.log('Object is tracked');
|
|
348
|
-
* } else {
|
|
349
|
-
* console.log('Object is not in the index');
|
|
350
|
-
* }
|
|
351
|
-
* ```
|
|
352
|
-
*/
|
|
353
|
-
async exists(sha) {
|
|
354
|
-
const location = await this.lookupLocation(sha);
|
|
355
|
-
return location !== null;
|
|
356
|
-
}
|
|
357
|
-
/**
|
|
358
|
-
* Deletes an object from the index.
|
|
359
|
-
*
|
|
360
|
-
* @description
|
|
361
|
-
* Removes the location record for an object. This does NOT delete
|
|
362
|
-
* the actual object data from storage - only the index entry.
|
|
363
|
-
*
|
|
364
|
-
* @param sha - The object's SHA-1 hash
|
|
365
|
-
*
|
|
366
|
-
* @returns true if the object was deleted, false if it didn't exist
|
|
367
|
-
*
|
|
368
|
-
* @example
|
|
369
|
-
* ```typescript
|
|
370
|
-
* if (await index.deleteLocation('abc123...')) {
|
|
371
|
-
* console.log('Location record deleted');
|
|
372
|
-
* } else {
|
|
373
|
-
* console.log('Object was not in the index');
|
|
374
|
-
* }
|
|
375
|
-
* ```
|
|
376
|
-
*/
|
|
377
|
-
async deleteLocation(sha) {
|
|
378
|
-
const result = this._storage.sql.exec('DELETE FROM object_index WHERE sha = ?', sha);
|
|
379
|
-
const rows = result.toArray();
|
|
380
|
-
return rows.length > 0 && rows[0].changes > 0;
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* Gets all objects in a specific tier.
|
|
384
|
-
*
|
|
385
|
-
* @description
|
|
386
|
-
* Returns all objects currently stored in the specified tier.
|
|
387
|
-
* Useful for migration planning or tier-specific operations.
|
|
388
|
-
*
|
|
389
|
-
* @param tier - The storage tier to query ('hot', 'r2', or 'parquet')
|
|
390
|
-
*
|
|
391
|
-
* @returns Array of object locations in the specified tier
|
|
392
|
-
*
|
|
393
|
-
* @example
|
|
394
|
-
* ```typescript
|
|
395
|
-
* // Get all hot tier objects
|
|
396
|
-
* const hotObjects = await index.getObjectsByTier('hot');
|
|
397
|
-
* console.log(`Hot tier has ${hotObjects.length} objects`);
|
|
398
|
-
*
|
|
399
|
-
* // Calculate total size
|
|
400
|
-
* const totalSize = hotObjects.reduce((sum, obj) => sum + obj.size, 0);
|
|
401
|
-
* console.log(`Total hot tier size: ${totalSize} bytes`);
|
|
402
|
-
* ```
|
|
403
|
-
*/
|
|
404
|
-
async getObjectsByTier(tier) {
|
|
405
|
-
const result = this._storage.sql.exec('SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE tier = ?', tier);
|
|
406
|
-
return result.toArray();
|
|
407
|
-
}
|
|
408
|
-
/**
|
|
409
|
-
* Gets all objects in a specific pack.
|
|
410
|
-
*
|
|
411
|
-
* @description
|
|
412
|
-
* Returns all objects stored in a particular packfile, sorted by offset.
|
|
413
|
-
* Useful for pack operations like repacking or verification.
|
|
414
|
-
*
|
|
415
|
-
* @param packId - The pack file identifier
|
|
416
|
-
*
|
|
417
|
-
* @returns Array of object locations in the pack, sorted by offset
|
|
418
|
-
*
|
|
419
|
-
* @example
|
|
420
|
-
* ```typescript
|
|
421
|
-
* const packObjects = await index.getObjectsByPack('pack-abc123');
|
|
422
|
-
* console.log(`Pack contains ${packObjects.length} objects`);
|
|
423
|
-
*
|
|
424
|
-
* // Objects are sorted by offset for sequential reading
|
|
425
|
-
* for (const obj of packObjects) {
|
|
426
|
-
* console.log(` ${obj.sha}: offset=${obj.offset}, size=${obj.size}`);
|
|
427
|
-
* }
|
|
428
|
-
* ```
|
|
429
|
-
*/
|
|
430
|
-
async getObjectsByPack(packId) {
|
|
431
|
-
const result = this._storage.sql.exec('SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE pack_id = ?', packId);
|
|
432
|
-
const locations = result.toArray();
|
|
433
|
-
// Sort by offset to ensure consistent ordering
|
|
434
|
-
return locations.sort((a, b) => (a.offset ?? 0) - (b.offset ?? 0));
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
/**
|
|
438
|
-
* Records the location of an object (standalone function).
|
|
439
|
-
*
|
|
440
|
-
* @description
|
|
441
|
-
* Standalone function that creates a temporary ObjectIndex instance
|
|
442
|
-
* to record an object's location. Useful when you don't need to
|
|
443
|
-
* maintain an ObjectIndex instance.
|
|
444
|
-
*
|
|
445
|
-
* @param storage - Durable Object storage instance
|
|
446
|
-
* @param options - Location recording options
|
|
447
|
-
*
|
|
448
|
-
* @throws {Error} If SHA format is invalid
|
|
449
|
-
*
|
|
450
|
-
* @example
|
|
451
|
-
* ```typescript
|
|
452
|
-
* await recordLocation(storage, {
|
|
453
|
-
* sha: 'abc123...',
|
|
454
|
-
* tier: 'hot',
|
|
455
|
-
* size: 1024,
|
|
456
|
-
* type: 'blob'
|
|
457
|
-
* });
|
|
458
|
-
* ```
|
|
459
|
-
*/
|
|
460
|
-
export async function recordLocation(storage, options) {
|
|
461
|
-
const index = new ObjectIndex(storage);
|
|
462
|
-
return index.recordLocation(options);
|
|
463
|
-
}
|
|
464
|
-
/**
|
|
465
|
-
* Looks up the location of an object by SHA (standalone function).
|
|
466
|
-
*
|
|
467
|
-
* @description
|
|
468
|
-
* Standalone function for single object lookup. Creates a temporary
|
|
469
|
-
* ObjectIndex instance internally.
|
|
470
|
-
*
|
|
471
|
-
* @param storage - Durable Object storage instance
|
|
472
|
-
* @param sha - The object's SHA-1 hash
|
|
473
|
-
*
|
|
474
|
-
* @returns Object location or null if not found
|
|
475
|
-
*
|
|
476
|
-
* @example
|
|
477
|
-
* ```typescript
|
|
478
|
-
* const location = await lookupLocation(storage, 'abc123...');
|
|
479
|
-
* if (location) {
|
|
480
|
-
* console.log(`Found in ${location.tier}`);
|
|
481
|
-
* }
|
|
482
|
-
* ```
|
|
483
|
-
*/
|
|
484
|
-
export async function lookupLocation(storage, sha) {
|
|
485
|
-
const index = new ObjectIndex(storage);
|
|
486
|
-
return index.lookupLocation(sha);
|
|
487
|
-
}
|
|
488
|
-
/**
|
|
489
|
-
* Performs batch lookup of multiple objects (standalone function).
|
|
490
|
-
*
|
|
491
|
-
* @description
|
|
492
|
-
* Standalone function for batch object lookup. More efficient than
|
|
493
|
-
* multiple single lookups when querying several objects.
|
|
494
|
-
*
|
|
495
|
-
* @param storage - Durable Object storage instance
|
|
496
|
-
* @param shas - Array of SHA-1 hashes to look up
|
|
497
|
-
*
|
|
498
|
-
* @returns Result containing found locations and missing SHAs
|
|
499
|
-
*
|
|
500
|
-
* @example
|
|
501
|
-
* ```typescript
|
|
502
|
-
* const result = await batchLookup(storage, ['sha1...', 'sha2...']);
|
|
503
|
-
* console.log(`Found: ${result.found.size}, Missing: ${result.missing.length}`);
|
|
504
|
-
* ```
|
|
505
|
-
*/
|
|
506
|
-
export async function batchLookup(storage, shas) {
|
|
507
|
-
const index = new ObjectIndex(storage);
|
|
508
|
-
return index.batchLookup(shas);
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* Gets statistics about object distribution (standalone function).
|
|
512
|
-
*
|
|
513
|
-
* @description
|
|
514
|
-
* Standalone function for retrieving object distribution statistics
|
|
515
|
-
* across storage tiers.
|
|
516
|
-
*
|
|
517
|
-
* @param storage - Durable Object storage instance
|
|
518
|
-
*
|
|
519
|
-
* @returns Statistics about objects in each tier
|
|
520
|
-
*
|
|
521
|
-
* @example
|
|
522
|
-
* ```typescript
|
|
523
|
-
* const stats = await getStats(storage);
|
|
524
|
-
* console.log(`Total: ${stats.totalObjects} objects`);
|
|
525
|
-
* console.log(`Hot: ${stats.hotCount}, R2: ${stats.r2Count}`);
|
|
526
|
-
* ```
|
|
527
|
-
*/
|
|
528
|
-
export async function getStats(storage) {
|
|
529
|
-
const index = new ObjectIndex(storage);
|
|
530
|
-
return index.getStats();
|
|
531
|
-
}
|
|
532
|
-
//# sourceMappingURL=object-index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"object-index.js","sourceRoot":"","sources":["../../src/storage/object-index.ts"],"names":[],"mappings":"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"}
|