gitx.do 0.0.1
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/LICENSE +21 -0
- package/README.md +156 -0
- package/dist/durable-object/object-store.d.ts +113 -0
- package/dist/durable-object/object-store.d.ts.map +1 -0
- package/dist/durable-object/object-store.js +387 -0
- package/dist/durable-object/object-store.js.map +1 -0
- package/dist/durable-object/schema.d.ts +17 -0
- package/dist/durable-object/schema.d.ts.map +1 -0
- package/dist/durable-object/schema.js +43 -0
- package/dist/durable-object/schema.js.map +1 -0
- package/dist/durable-object/wal.d.ts +111 -0
- package/dist/durable-object/wal.d.ts.map +1 -0
- package/dist/durable-object/wal.js +200 -0
- package/dist/durable-object/wal.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/adapter.d.ts +231 -0
- package/dist/mcp/adapter.d.ts.map +1 -0
- package/dist/mcp/adapter.js +502 -0
- package/dist/mcp/adapter.js.map +1 -0
- package/dist/mcp/sandbox.d.ts +261 -0
- package/dist/mcp/sandbox.d.ts.map +1 -0
- package/dist/mcp/sandbox.js +983 -0
- package/dist/mcp/sandbox.js.map +1 -0
- package/dist/mcp/sdk-adapter.d.ts +413 -0
- package/dist/mcp/sdk-adapter.d.ts.map +1 -0
- package/dist/mcp/sdk-adapter.js +672 -0
- package/dist/mcp/sdk-adapter.js.map +1 -0
- package/dist/mcp/tools.d.ts +133 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +1604 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/ops/blame.d.ts +148 -0
- package/dist/ops/blame.d.ts.map +1 -0
- package/dist/ops/blame.js +754 -0
- package/dist/ops/blame.js.map +1 -0
- package/dist/ops/branch.d.ts +215 -0
- package/dist/ops/branch.d.ts.map +1 -0
- package/dist/ops/branch.js +608 -0
- package/dist/ops/branch.js.map +1 -0
- package/dist/ops/commit-traversal.d.ts +209 -0
- package/dist/ops/commit-traversal.d.ts.map +1 -0
- package/dist/ops/commit-traversal.js +755 -0
- package/dist/ops/commit-traversal.js.map +1 -0
- package/dist/ops/commit.d.ts +221 -0
- package/dist/ops/commit.d.ts.map +1 -0
- package/dist/ops/commit.js +606 -0
- package/dist/ops/commit.js.map +1 -0
- package/dist/ops/merge-base.d.ts +223 -0
- package/dist/ops/merge-base.d.ts.map +1 -0
- package/dist/ops/merge-base.js +581 -0
- package/dist/ops/merge-base.js.map +1 -0
- package/dist/ops/merge.d.ts +385 -0
- package/dist/ops/merge.d.ts.map +1 -0
- package/dist/ops/merge.js +1203 -0
- package/dist/ops/merge.js.map +1 -0
- package/dist/ops/tag.d.ts +182 -0
- package/dist/ops/tag.d.ts.map +1 -0
- package/dist/ops/tag.js +608 -0
- package/dist/ops/tag.js.map +1 -0
- package/dist/ops/tree-builder.d.ts +82 -0
- package/dist/ops/tree-builder.d.ts.map +1 -0
- package/dist/ops/tree-builder.js +246 -0
- package/dist/ops/tree-builder.js.map +1 -0
- package/dist/ops/tree-diff.d.ts +243 -0
- package/dist/ops/tree-diff.d.ts.map +1 -0
- package/dist/ops/tree-diff.js +657 -0
- package/dist/ops/tree-diff.js.map +1 -0
- package/dist/pack/delta.d.ts +68 -0
- package/dist/pack/delta.d.ts.map +1 -0
- package/dist/pack/delta.js +343 -0
- package/dist/pack/delta.js.map +1 -0
- package/dist/pack/format.d.ts +84 -0
- package/dist/pack/format.d.ts.map +1 -0
- package/dist/pack/format.js +261 -0
- package/dist/pack/format.js.map +1 -0
- package/dist/pack/full-generation.d.ts +327 -0
- package/dist/pack/full-generation.d.ts.map +1 -0
- package/dist/pack/full-generation.js +1159 -0
- package/dist/pack/full-generation.js.map +1 -0
- package/dist/pack/generation.d.ts +118 -0
- package/dist/pack/generation.d.ts.map +1 -0
- package/dist/pack/generation.js +459 -0
- package/dist/pack/generation.js.map +1 -0
- package/dist/pack/index.d.ts +181 -0
- package/dist/pack/index.d.ts.map +1 -0
- package/dist/pack/index.js +552 -0
- package/dist/pack/index.js.map +1 -0
- package/dist/refs/branch.d.ts +224 -0
- package/dist/refs/branch.d.ts.map +1 -0
- package/dist/refs/branch.js +170 -0
- package/dist/refs/branch.js.map +1 -0
- package/dist/refs/storage.d.ts +208 -0
- package/dist/refs/storage.d.ts.map +1 -0
- package/dist/refs/storage.js +421 -0
- package/dist/refs/storage.js.map +1 -0
- package/dist/refs/tag.d.ts +230 -0
- package/dist/refs/tag.d.ts.map +1 -0
- package/dist/refs/tag.js +188 -0
- package/dist/refs/tag.js.map +1 -0
- package/dist/storage/lru-cache.d.ts +188 -0
- package/dist/storage/lru-cache.d.ts.map +1 -0
- package/dist/storage/lru-cache.js +410 -0
- package/dist/storage/lru-cache.js.map +1 -0
- package/dist/storage/object-index.d.ts +140 -0
- package/dist/storage/object-index.d.ts.map +1 -0
- package/dist/storage/object-index.js +166 -0
- package/dist/storage/object-index.js.map +1 -0
- package/dist/storage/r2-pack.d.ts +394 -0
- package/dist/storage/r2-pack.d.ts.map +1 -0
- package/dist/storage/r2-pack.js +1062 -0
- package/dist/storage/r2-pack.js.map +1 -0
- package/dist/tiered/cdc-pipeline.d.ts +316 -0
- package/dist/tiered/cdc-pipeline.d.ts.map +1 -0
- package/dist/tiered/cdc-pipeline.js +771 -0
- package/dist/tiered/cdc-pipeline.js.map +1 -0
- package/dist/tiered/migration.d.ts +242 -0
- package/dist/tiered/migration.d.ts.map +1 -0
- package/dist/tiered/migration.js +592 -0
- package/dist/tiered/migration.js.map +1 -0
- package/dist/tiered/parquet-writer.d.ts +248 -0
- package/dist/tiered/parquet-writer.d.ts.map +1 -0
- package/dist/tiered/parquet-writer.js +555 -0
- package/dist/tiered/parquet-writer.js.map +1 -0
- package/dist/tiered/read-path.d.ts +141 -0
- package/dist/tiered/read-path.d.ts.map +1 -0
- package/dist/tiered/read-path.js +204 -0
- package/dist/tiered/read-path.js.map +1 -0
- package/dist/types/objects.d.ts +53 -0
- package/dist/types/objects.d.ts.map +1 -0
- package/dist/types/objects.js +291 -0
- package/dist/types/objects.js.map +1 -0
- package/dist/types/storage.d.ts +117 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +8 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/utils/hash.d.ts +31 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +60 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/sha1.d.ts +26 -0
- package/dist/utils/sha1.d.ts.map +1 -0
- package/dist/utils/sha1.js +127 -0
- package/dist/utils/sha1.js.map +1 -0
- package/dist/wire/capabilities.d.ts +236 -0
- package/dist/wire/capabilities.d.ts.map +1 -0
- package/dist/wire/capabilities.js +437 -0
- package/dist/wire/capabilities.js.map +1 -0
- package/dist/wire/pkt-line.d.ts +67 -0
- package/dist/wire/pkt-line.d.ts.map +1 -0
- package/dist/wire/pkt-line.js +145 -0
- package/dist/wire/pkt-line.js.map +1 -0
- package/dist/wire/receive-pack.d.ts +302 -0
- package/dist/wire/receive-pack.d.ts.map +1 -0
- package/dist/wire/receive-pack.js +885 -0
- package/dist/wire/receive-pack.js.map +1 -0
- package/dist/wire/smart-http.d.ts +321 -0
- package/dist/wire/smart-http.d.ts.map +1 -0
- package/dist/wire/smart-http.js +654 -0
- package/dist/wire/smart-http.js.map +1 -0
- package/dist/wire/upload-pack.d.ts +333 -0
- package/dist/wire/upload-pack.d.ts.map +1 -0
- package/dist/wire/upload-pack.js +850 -0
- package/dist/wire/upload-pack.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiered Read Path
|
|
3
|
+
*
|
|
4
|
+
* Implements reading objects from the multi-tier storage system:
|
|
5
|
+
* - Hot tier: Durable Object SQLite (fastest, local)
|
|
6
|
+
* - Warm tier: R2 object storage (medium latency, packed objects)
|
|
7
|
+
* - Cold tier: Analytics/Parquet (highest latency, cold storage)
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Tier fallback on miss
|
|
11
|
+
* - Cache promotion (read-through caching)
|
|
12
|
+
* - Configurable promotion policies
|
|
13
|
+
*
|
|
14
|
+
* gitdo-aaw: Tiered read path implementation
|
|
15
|
+
*/
|
|
16
|
+
import { ObjectType } from '../types/objects';
|
|
17
|
+
/**
|
|
18
|
+
* Stored object representation
|
|
19
|
+
*/
|
|
20
|
+
export interface StoredObject {
|
|
21
|
+
sha: string;
|
|
22
|
+
type: ObjectType;
|
|
23
|
+
size: number;
|
|
24
|
+
data: Uint8Array;
|
|
25
|
+
createdAt: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Configuration for a single tier
|
|
29
|
+
*/
|
|
30
|
+
export interface TierConfig {
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
maxSize?: number;
|
|
33
|
+
ttl?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Configuration for the tiered storage system
|
|
37
|
+
*/
|
|
38
|
+
export interface TieredStorageConfig {
|
|
39
|
+
hot: TierConfig;
|
|
40
|
+
warm: TierConfig;
|
|
41
|
+
cold: TierConfig;
|
|
42
|
+
promotionPolicy: 'aggressive' | 'conservative' | 'none';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Result of a read operation
|
|
46
|
+
*/
|
|
47
|
+
export interface ReadResult {
|
|
48
|
+
object: StoredObject | null;
|
|
49
|
+
tier: 'hot' | 'warm' | 'cold' | null;
|
|
50
|
+
promoted: boolean;
|
|
51
|
+
latencyMs: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Interface for the tiered object store
|
|
55
|
+
*/
|
|
56
|
+
export interface TieredObjectStore {
|
|
57
|
+
read(sha: string): Promise<ReadResult>;
|
|
58
|
+
readFromHot(sha: string): Promise<StoredObject | null>;
|
|
59
|
+
readFromWarm(sha: string): Promise<StoredObject | null>;
|
|
60
|
+
readFromCold(sha: string): Promise<StoredObject | null>;
|
|
61
|
+
promoteToHot(sha: string, object: StoredObject): Promise<void>;
|
|
62
|
+
getConfig(): TieredStorageConfig;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Hot tier backend interface (Durable Object SQLite)
|
|
66
|
+
*/
|
|
67
|
+
export interface HotTierBackend {
|
|
68
|
+
get(sha: string): Promise<StoredObject | null>;
|
|
69
|
+
put(sha: string, object: StoredObject): Promise<void>;
|
|
70
|
+
delete(sha: string): Promise<boolean>;
|
|
71
|
+
has(sha: string): Promise<boolean>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Warm tier backend interface (R2 object storage)
|
|
75
|
+
*/
|
|
76
|
+
export interface WarmTierBackend {
|
|
77
|
+
get(sha: string): Promise<StoredObject | null>;
|
|
78
|
+
getFromPack(packId: string, offset: number): Promise<StoredObject | null>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Cold tier backend interface (Analytics/Parquet)
|
|
82
|
+
*/
|
|
83
|
+
export interface ColdTierBackend {
|
|
84
|
+
get(sha: string): Promise<StoredObject | null>;
|
|
85
|
+
query(filter: {
|
|
86
|
+
type?: ObjectType;
|
|
87
|
+
minSize?: number;
|
|
88
|
+
maxSize?: number;
|
|
89
|
+
}): Promise<StoredObject[]>;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* TieredReader - Main implementation of the tiered read path
|
|
93
|
+
*
|
|
94
|
+
* Reads objects from multiple storage tiers with fallback logic
|
|
95
|
+
* and optional promotion to hotter tiers.
|
|
96
|
+
*/
|
|
97
|
+
export declare class TieredReader implements TieredObjectStore {
|
|
98
|
+
private hotBackend;
|
|
99
|
+
private warmBackend;
|
|
100
|
+
private coldBackend;
|
|
101
|
+
private config;
|
|
102
|
+
constructor(hotBackend: HotTierBackend, warmBackend: WarmTierBackend, coldBackend: ColdTierBackend, config: TieredStorageConfig);
|
|
103
|
+
/**
|
|
104
|
+
* Read an object from the tiered storage system
|
|
105
|
+
*
|
|
106
|
+
* Tries each enabled tier in order: hot -> warm -> cold
|
|
107
|
+
* Promotes objects to hot tier based on promotion policy
|
|
108
|
+
*/
|
|
109
|
+
read(sha: string): Promise<ReadResult>;
|
|
110
|
+
/**
|
|
111
|
+
* Read an object directly from the hot tier
|
|
112
|
+
*/
|
|
113
|
+
readFromHot(sha: string): Promise<StoredObject | null>;
|
|
114
|
+
/**
|
|
115
|
+
* Read an object directly from the warm tier
|
|
116
|
+
*/
|
|
117
|
+
readFromWarm(sha: string): Promise<StoredObject | null>;
|
|
118
|
+
/**
|
|
119
|
+
* Read an object directly from the cold tier
|
|
120
|
+
*/
|
|
121
|
+
readFromCold(sha: string): Promise<StoredObject | null>;
|
|
122
|
+
/**
|
|
123
|
+
* Manually promote an object to the hot tier
|
|
124
|
+
*/
|
|
125
|
+
promoteToHot(sha: string, object: StoredObject): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Get the current configuration
|
|
128
|
+
*/
|
|
129
|
+
getConfig(): TieredStorageConfig;
|
|
130
|
+
/**
|
|
131
|
+
* Try to promote an object to the hot tier based on policy
|
|
132
|
+
*
|
|
133
|
+
* @param sha - The object's SHA
|
|
134
|
+
* @param object - The object to promote
|
|
135
|
+
* @param sourceTier - The tier the object was read from
|
|
136
|
+
* @returns true if promotion was successful
|
|
137
|
+
*/
|
|
138
|
+
private tryPromote;
|
|
139
|
+
}
|
|
140
|
+
export { TieredReader as TieredObjectStoreStub };
|
|
141
|
+
//# sourceMappingURL=read-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-path.d.ts","sourceRoot":"","sources":["../../src/tiered/read-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiered Read Path
|
|
3
|
+
*
|
|
4
|
+
* Implements reading objects from the multi-tier storage system:
|
|
5
|
+
* - Hot tier: Durable Object SQLite (fastest, local)
|
|
6
|
+
* - Warm tier: R2 object storage (medium latency, packed objects)
|
|
7
|
+
* - Cold tier: Analytics/Parquet (highest latency, cold storage)
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Tier fallback on miss
|
|
11
|
+
* - Cache promotion (read-through caching)
|
|
12
|
+
* - Configurable promotion policies
|
|
13
|
+
*
|
|
14
|
+
* gitdo-aaw: Tiered read path implementation
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Validates a SHA-1 hash
|
|
18
|
+
*/
|
|
19
|
+
function isValidSha(sha) {
|
|
20
|
+
if (!sha || sha.length !== 40) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return /^[0-9a-f]{40}$/i.test(sha);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* TieredReader - Main implementation of the tiered read path
|
|
27
|
+
*
|
|
28
|
+
* Reads objects from multiple storage tiers with fallback logic
|
|
29
|
+
* and optional promotion to hotter tiers.
|
|
30
|
+
*/
|
|
31
|
+
export class TieredReader {
|
|
32
|
+
hotBackend;
|
|
33
|
+
warmBackend;
|
|
34
|
+
coldBackend;
|
|
35
|
+
config;
|
|
36
|
+
constructor(hotBackend, warmBackend, coldBackend, config) {
|
|
37
|
+
this.hotBackend = hotBackend;
|
|
38
|
+
this.warmBackend = warmBackend;
|
|
39
|
+
this.coldBackend = coldBackend;
|
|
40
|
+
this.config = config;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Read an object from the tiered storage system
|
|
44
|
+
*
|
|
45
|
+
* Tries each enabled tier in order: hot -> warm -> cold
|
|
46
|
+
* Promotes objects to hot tier based on promotion policy
|
|
47
|
+
*/
|
|
48
|
+
async read(sha) {
|
|
49
|
+
const startTime = performance.now();
|
|
50
|
+
// Validate SHA
|
|
51
|
+
if (!isValidSha(sha)) {
|
|
52
|
+
return {
|
|
53
|
+
object: null,
|
|
54
|
+
tier: null,
|
|
55
|
+
promoted: false,
|
|
56
|
+
latencyMs: performance.now() - startTime
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Try hot tier first
|
|
60
|
+
if (this.config.hot.enabled) {
|
|
61
|
+
try {
|
|
62
|
+
const obj = await this.hotBackend.get(sha);
|
|
63
|
+
if (obj) {
|
|
64
|
+
return {
|
|
65
|
+
object: obj,
|
|
66
|
+
tier: 'hot',
|
|
67
|
+
promoted: false,
|
|
68
|
+
latencyMs: performance.now() - startTime
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Hot tier failed, continue to next tier
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Try warm tier
|
|
77
|
+
if (this.config.warm.enabled) {
|
|
78
|
+
try {
|
|
79
|
+
const obj = await this.warmBackend.get(sha);
|
|
80
|
+
if (obj) {
|
|
81
|
+
const promoted = await this.tryPromote(sha, obj, 'warm');
|
|
82
|
+
return {
|
|
83
|
+
object: obj,
|
|
84
|
+
tier: 'warm',
|
|
85
|
+
promoted,
|
|
86
|
+
latencyMs: performance.now() - startTime
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Warm tier failed, continue to cold tier
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Try cold tier
|
|
95
|
+
if (this.config.cold.enabled) {
|
|
96
|
+
try {
|
|
97
|
+
const obj = await this.coldBackend.get(sha);
|
|
98
|
+
if (obj) {
|
|
99
|
+
const promoted = await this.tryPromote(sha, obj, 'cold');
|
|
100
|
+
return {
|
|
101
|
+
object: obj,
|
|
102
|
+
tier: 'cold',
|
|
103
|
+
promoted,
|
|
104
|
+
latencyMs: performance.now() - startTime
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Cold tier failed
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Object not found in any tier
|
|
113
|
+
return {
|
|
114
|
+
object: null,
|
|
115
|
+
tier: null,
|
|
116
|
+
promoted: false,
|
|
117
|
+
latencyMs: performance.now() - startTime
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Read an object directly from the hot tier
|
|
122
|
+
*/
|
|
123
|
+
async readFromHot(sha) {
|
|
124
|
+
try {
|
|
125
|
+
return await this.hotBackend.get(sha);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Read an object directly from the warm tier
|
|
133
|
+
*/
|
|
134
|
+
async readFromWarm(sha) {
|
|
135
|
+
try {
|
|
136
|
+
return await this.warmBackend.get(sha);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Read an object directly from the cold tier
|
|
144
|
+
*/
|
|
145
|
+
async readFromCold(sha) {
|
|
146
|
+
try {
|
|
147
|
+
return await this.coldBackend.get(sha);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Manually promote an object to the hot tier
|
|
155
|
+
*/
|
|
156
|
+
async promoteToHot(sha, object) {
|
|
157
|
+
await this.hotBackend.put(sha, object);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get the current configuration
|
|
161
|
+
*/
|
|
162
|
+
getConfig() {
|
|
163
|
+
return this.config;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Try to promote an object to the hot tier based on policy
|
|
167
|
+
*
|
|
168
|
+
* @param sha - The object's SHA
|
|
169
|
+
* @param object - The object to promote
|
|
170
|
+
* @param sourceTier - The tier the object was read from
|
|
171
|
+
* @returns true if promotion was successful
|
|
172
|
+
*/
|
|
173
|
+
async tryPromote(sha, object, _sourceTier) {
|
|
174
|
+
// Check if hot tier is enabled
|
|
175
|
+
if (!this.config.hot.enabled) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
// Check promotion policy
|
|
179
|
+
if (this.config.promotionPolicy === 'none') {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
// Conservative policy only promotes from warm tier on repeated access
|
|
183
|
+
// For now, conservative means no automatic promotion on first read
|
|
184
|
+
if (this.config.promotionPolicy === 'conservative') {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
// Check size limit for hot tier
|
|
188
|
+
if (this.config.hot.maxSize !== undefined && object.size > this.config.hot.maxSize) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
// Try to promote
|
|
192
|
+
try {
|
|
193
|
+
await this.hotBackend.put(sha, object);
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Promotion failed, but we still have the object
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Re-export as TieredObjectStoreStub for backward compatibility with tests
|
|
203
|
+
export { TieredReader as TieredObjectStoreStub };
|
|
204
|
+
//# sourceMappingURL=read-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-path.js","sourceRoot":"","sources":["../../src/tiered/read-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export type ObjectType = 'blob' | 'tree' | 'commit' | 'tag';
|
|
2
|
+
export interface GitObject {
|
|
3
|
+
type: ObjectType;
|
|
4
|
+
data: Uint8Array;
|
|
5
|
+
}
|
|
6
|
+
export interface BlobObject extends GitObject {
|
|
7
|
+
type: 'blob';
|
|
8
|
+
}
|
|
9
|
+
export interface TreeEntry {
|
|
10
|
+
mode: string;
|
|
11
|
+
name: string;
|
|
12
|
+
sha: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TreeObject extends GitObject {
|
|
15
|
+
type: 'tree';
|
|
16
|
+
entries: TreeEntry[];
|
|
17
|
+
}
|
|
18
|
+
export interface Author {
|
|
19
|
+
name: string;
|
|
20
|
+
email: string;
|
|
21
|
+
timestamp: number;
|
|
22
|
+
timezone: string;
|
|
23
|
+
}
|
|
24
|
+
export interface CommitObject extends GitObject {
|
|
25
|
+
type: 'commit';
|
|
26
|
+
tree: string;
|
|
27
|
+
parents: string[];
|
|
28
|
+
author: Author;
|
|
29
|
+
committer: Author;
|
|
30
|
+
message: string;
|
|
31
|
+
}
|
|
32
|
+
export interface TagObject extends GitObject {
|
|
33
|
+
type: 'tag';
|
|
34
|
+
object: string;
|
|
35
|
+
objectType: ObjectType;
|
|
36
|
+
tagger?: Author;
|
|
37
|
+
message: string;
|
|
38
|
+
name: string;
|
|
39
|
+
tag?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function isBlob(obj: GitObject): obj is BlobObject;
|
|
42
|
+
export declare function isTree(obj: GitObject): obj is TreeObject;
|
|
43
|
+
export declare function isCommit(obj: GitObject): obj is CommitObject;
|
|
44
|
+
export declare function isTag(obj: GitObject): obj is TagObject;
|
|
45
|
+
export declare function serializeBlob(data: Uint8Array): Uint8Array;
|
|
46
|
+
export declare function serializeTree(entries: TreeEntry[]): Uint8Array;
|
|
47
|
+
export declare function serializeCommit(commit: Omit<CommitObject, 'type' | 'data'>): Uint8Array;
|
|
48
|
+
export declare function serializeTag(tag: Omit<TagObject, 'type' | 'data'>): Uint8Array;
|
|
49
|
+
export declare function parseBlob(data: Uint8Array): BlobObject;
|
|
50
|
+
export declare function parseTree(data: Uint8Array): TreeObject;
|
|
51
|
+
export declare function parseCommit(data: Uint8Array): CommitObject;
|
|
52
|
+
export declare function parseTag(data: Uint8Array): TagObject;
|
|
53
|
+
//# sourceMappingURL=objects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objects.d.ts","sourceRoot":"","sources":["../../src/types/objects.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;AAE3D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,SAAS,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C,IAAI,EAAE,KAAK,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAGD,wBAAgB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,GAAG,IAAI,UAAU,CAExD;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,GAAG,IAAI,UAAU,CAExD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,GAAG,IAAI,YAAY,CAE5D;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,GAAG,IAAI,SAAS,CAEtD;AAuCD,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAO1D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAqC9D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,UAAU,CAuBvF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,UAAU,CAuB9E;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAmBtD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CA2CtD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAwD1D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAwDpD"}
|