@nahisaho/yata-scale 1.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +66 -0
  2. package/dist/CacheManager.d.ts +107 -0
  3. package/dist/CacheManager.d.ts.map +1 -0
  4. package/dist/CacheManager.js +343 -0
  5. package/dist/CacheManager.js.map +1 -0
  6. package/dist/IndexManager.d.ts +103 -0
  7. package/dist/IndexManager.d.ts.map +1 -0
  8. package/dist/IndexManager.js +385 -0
  9. package/dist/IndexManager.js.map +1 -0
  10. package/dist/MigrationHelper.d.ts +91 -0
  11. package/dist/MigrationHelper.d.ts.map +1 -0
  12. package/dist/MigrationHelper.js +220 -0
  13. package/dist/MigrationHelper.js.map +1 -0
  14. package/dist/QueryCoordinator.d.ts +76 -0
  15. package/dist/QueryCoordinator.d.ts.map +1 -0
  16. package/dist/QueryCoordinator.js +298 -0
  17. package/dist/QueryCoordinator.js.map +1 -0
  18. package/dist/ShardManager.d.ts +48 -0
  19. package/dist/ShardManager.d.ts.map +1 -0
  20. package/dist/ShardManager.js +193 -0
  21. package/dist/ShardManager.js.map +1 -0
  22. package/dist/SyncController.d.ts +102 -0
  23. package/dist/SyncController.d.ts.map +1 -0
  24. package/dist/SyncController.js +286 -0
  25. package/dist/SyncController.js.map +1 -0
  26. package/dist/YataScaleManager.d.ts +75 -0
  27. package/dist/YataScaleManager.d.ts.map +1 -0
  28. package/dist/YataScaleManager.js +265 -0
  29. package/dist/YataScaleManager.js.map +1 -0
  30. package/dist/cache/CacheManager.d.ts +116 -0
  31. package/dist/cache/CacheManager.d.ts.map +1 -0
  32. package/dist/cache/CacheManager.js +286 -0
  33. package/dist/cache/CacheManager.js.map +1 -0
  34. package/dist/cache/InvalidationManager.d.ts +91 -0
  35. package/dist/cache/InvalidationManager.d.ts.map +1 -0
  36. package/dist/cache/InvalidationManager.js +155 -0
  37. package/dist/cache/InvalidationManager.js.map +1 -0
  38. package/dist/cache/L1Cache.d.ts +97 -0
  39. package/dist/cache/L1Cache.d.ts.map +1 -0
  40. package/dist/cache/L1Cache.js +225 -0
  41. package/dist/cache/L1Cache.js.map +1 -0
  42. package/dist/cache/L2Cache.d.ts +93 -0
  43. package/dist/cache/L2Cache.d.ts.map +1 -0
  44. package/dist/cache/L2Cache.js +248 -0
  45. package/dist/cache/L2Cache.js.map +1 -0
  46. package/dist/cache/L3Cache.d.ts +101 -0
  47. package/dist/cache/L3Cache.d.ts.map +1 -0
  48. package/dist/cache/L3Cache.js +229 -0
  49. package/dist/cache/L3Cache.js.map +1 -0
  50. package/dist/cache/index.d.ts +12 -0
  51. package/dist/cache/index.d.ts.map +1 -0
  52. package/dist/cache/index.js +11 -0
  53. package/dist/cache/index.js.map +1 -0
  54. package/dist/errors.d.ts +255 -0
  55. package/dist/errors.d.ts.map +1 -0
  56. package/dist/errors.js +515 -0
  57. package/dist/errors.js.map +1 -0
  58. package/dist/index/BPlusTreeIndex.d.ts +101 -0
  59. package/dist/index/BPlusTreeIndex.d.ts.map +1 -0
  60. package/dist/index/BPlusTreeIndex.js +310 -0
  61. package/dist/index/BPlusTreeIndex.js.map +1 -0
  62. package/dist/index/BloomFilter.d.ts +85 -0
  63. package/dist/index/BloomFilter.d.ts.map +1 -0
  64. package/dist/index/BloomFilter.js +215 -0
  65. package/dist/index/BloomFilter.js.map +1 -0
  66. package/dist/index/FullTextIndex.d.ts +87 -0
  67. package/dist/index/FullTextIndex.d.ts.map +1 -0
  68. package/dist/index/FullTextIndex.js +213 -0
  69. package/dist/index/FullTextIndex.js.map +1 -0
  70. package/dist/index/GraphIndex.d.ts +116 -0
  71. package/dist/index/GraphIndex.d.ts.map +1 -0
  72. package/dist/index/GraphIndex.js +308 -0
  73. package/dist/index/GraphIndex.js.map +1 -0
  74. package/dist/index/IndexManager.d.ts +105 -0
  75. package/dist/index/IndexManager.d.ts.map +1 -0
  76. package/dist/index/IndexManager.js +287 -0
  77. package/dist/index/IndexManager.js.map +1 -0
  78. package/dist/index/index.d.ts +12 -0
  79. package/dist/index/index.d.ts.map +1 -0
  80. package/dist/index/index.js +11 -0
  81. package/dist/index/index.js.map +1 -0
  82. package/dist/index.d.ts +12 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +12 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/query/DistributedExecutor.d.ts +78 -0
  87. package/dist/query/DistributedExecutor.d.ts.map +1 -0
  88. package/dist/query/DistributedExecutor.js +232 -0
  89. package/dist/query/DistributedExecutor.js.map +1 -0
  90. package/dist/query/QueryCoordinator.d.ts +98 -0
  91. package/dist/query/QueryCoordinator.d.ts.map +1 -0
  92. package/dist/query/QueryCoordinator.js +246 -0
  93. package/dist/query/QueryCoordinator.js.map +1 -0
  94. package/dist/query/QueryPlanner.d.ts +88 -0
  95. package/dist/query/QueryPlanner.d.ts.map +1 -0
  96. package/dist/query/QueryPlanner.js +235 -0
  97. package/dist/query/QueryPlanner.js.map +1 -0
  98. package/dist/query/WorkerPool.d.ts +108 -0
  99. package/dist/query/WorkerPool.d.ts.map +1 -0
  100. package/dist/query/WorkerPool.js +195 -0
  101. package/dist/query/WorkerPool.js.map +1 -0
  102. package/dist/query/index.d.ts +11 -0
  103. package/dist/query/index.d.ts.map +1 -0
  104. package/dist/query/index.js +10 -0
  105. package/dist/query/index.js.map +1 -0
  106. package/dist/shard/GraphPartitionStrategy.d.ts +65 -0
  107. package/dist/shard/GraphPartitionStrategy.d.ts.map +1 -0
  108. package/dist/shard/GraphPartitionStrategy.js +208 -0
  109. package/dist/shard/GraphPartitionStrategy.js.map +1 -0
  110. package/dist/shard/HashPartitionStrategy.d.ts +56 -0
  111. package/dist/shard/HashPartitionStrategy.d.ts.map +1 -0
  112. package/dist/shard/HashPartitionStrategy.js +169 -0
  113. package/dist/shard/HashPartitionStrategy.js.map +1 -0
  114. package/dist/shard/RangePartitionStrategy.d.ts +63 -0
  115. package/dist/shard/RangePartitionStrategy.d.ts.map +1 -0
  116. package/dist/shard/RangePartitionStrategy.js +157 -0
  117. package/dist/shard/RangePartitionStrategy.js.map +1 -0
  118. package/dist/shard/Rebalancer.d.ts +70 -0
  119. package/dist/shard/Rebalancer.d.ts.map +1 -0
  120. package/dist/shard/Rebalancer.js +184 -0
  121. package/dist/shard/Rebalancer.js.map +1 -0
  122. package/dist/shard/ShardManager.d.ts +123 -0
  123. package/dist/shard/ShardManager.d.ts.map +1 -0
  124. package/dist/shard/ShardManager.js +353 -0
  125. package/dist/shard/ShardManager.js.map +1 -0
  126. package/dist/shard/ShardRouter.d.ts +102 -0
  127. package/dist/shard/ShardRouter.d.ts.map +1 -0
  128. package/dist/shard/ShardRouter.js +181 -0
  129. package/dist/shard/ShardRouter.js.map +1 -0
  130. package/dist/shard/index.d.ts +13 -0
  131. package/dist/shard/index.d.ts.map +1 -0
  132. package/dist/shard/index.js +12 -0
  133. package/dist/shard/index.js.map +1 -0
  134. package/dist/sync/ConflictResolver.d.ts +71 -0
  135. package/dist/sync/ConflictResolver.d.ts.map +1 -0
  136. package/dist/sync/ConflictResolver.js +214 -0
  137. package/dist/sync/ConflictResolver.js.map +1 -0
  138. package/dist/sync/SyncController.d.ts +150 -0
  139. package/dist/sync/SyncController.d.ts.map +1 -0
  140. package/dist/sync/SyncController.js +304 -0
  141. package/dist/sync/SyncController.js.map +1 -0
  142. package/dist/sync/VectorClock.d.ts +102 -0
  143. package/dist/sync/VectorClock.d.ts.map +1 -0
  144. package/dist/sync/VectorClock.js +189 -0
  145. package/dist/sync/VectorClock.js.map +1 -0
  146. package/dist/sync/WALManager.d.ts +120 -0
  147. package/dist/sync/WALManager.d.ts.map +1 -0
  148. package/dist/sync/WALManager.js +240 -0
  149. package/dist/sync/WALManager.js.map +1 -0
  150. package/dist/sync/index.d.ts +11 -0
  151. package/dist/sync/index.d.ts.map +1 -0
  152. package/dist/sync/index.js +10 -0
  153. package/dist/sync/index.js.map +1 -0
  154. package/dist/types.d.ts +323 -0
  155. package/dist/types.d.ts.map +1 -0
  156. package/dist/types.js +7 -0
  157. package/dist/types.js.map +1 -0
  158. package/package.json +86 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * @nahisaho/yata-scale - Shard Manager
3
+ *
4
+ * Manages shard lifecycle, health, and operations
5
+ */
6
+ import { ok, err } from 'neverthrow';
7
+ import { ShardError, ShardNotFoundError, RebalanceError, } from '../errors.js';
8
+ import { ShardRouter } from './ShardRouter.js';
9
+ /**
10
+ * Shard manager for lifecycle and operations
11
+ */
12
+ export class ShardManager {
13
+ strategyType;
14
+ storageFactory;
15
+ shards = new Map();
16
+ storage = new Map();
17
+ router;
18
+ rebalanceJobs = new Map();
19
+ healthCheckInterval;
20
+ constructor(strategyType, storageFactory) {
21
+ this.strategyType = strategyType;
22
+ this.storageFactory = storageFactory;
23
+ this.router = new ShardRouter(strategyType, []);
24
+ }
25
+ /**
26
+ * Initialize with shard configurations
27
+ */
28
+ async initialize(configs) {
29
+ for (const config of configs) {
30
+ await this.createShard(config);
31
+ }
32
+ // Start health check
33
+ this.startHealthCheck();
34
+ }
35
+ /**
36
+ * Create a new shard
37
+ */
38
+ async createShard(config) {
39
+ if (this.shards.has(config.shardId)) {
40
+ return err(new ShardError(`Shard already exists: ${config.shardId}`, config.shardId));
41
+ }
42
+ try {
43
+ // Create storage
44
+ const shardStorage = this.storageFactory(config);
45
+ await shardStorage.open();
46
+ this.storage.set(config.shardId, shardStorage);
47
+ // Create shard info
48
+ const info = {
49
+ shardId: config.shardId,
50
+ status: 'active',
51
+ entityCount: 0,
52
+ relationshipCount: 0,
53
+ sizeBytes: 0,
54
+ location: config.location,
55
+ endpoint: config.endpoint,
56
+ replicas: [],
57
+ lastModified: new Date(),
58
+ health: {
59
+ healthy: true,
60
+ latencyMs: 0,
61
+ errorRate: 0,
62
+ lastChecked: new Date(),
63
+ },
64
+ };
65
+ this.shards.set(config.shardId, info);
66
+ // Register with router
67
+ const connection = this.createConnection(info);
68
+ this.router.registerConnection(connection);
69
+ return ok(info);
70
+ }
71
+ catch (error) {
72
+ return err(new ShardError(`Failed to create shard: ${error instanceof Error ? error.message : String(error)}`, config.shardId, error instanceof Error ? error : undefined));
73
+ }
74
+ }
75
+ /**
76
+ * Remove a shard
77
+ */
78
+ async removeShard(shardId, graceful = true) {
79
+ const info = this.shards.get(shardId);
80
+ if (!info) {
81
+ return err(new ShardNotFoundError(shardId));
82
+ }
83
+ if (graceful && info.entityCount > 0) {
84
+ // Mark as draining and wait for rebalance
85
+ this.updateShardStatus(shardId, 'draining');
86
+ // Start rebalance to move data away
87
+ const rebalanceResult = await this.startRebalance({
88
+ targetShards: [...this.shards.keys()].filter((id) => id !== shardId),
89
+ });
90
+ if (rebalanceResult.isErr()) {
91
+ return err(new ShardError(`Failed to drain shard: ${rebalanceResult.error.message}`, shardId, rebalanceResult.error));
92
+ }
93
+ }
94
+ try {
95
+ // Close and remove storage
96
+ const shardStorage = this.storage.get(shardId);
97
+ if (shardStorage) {
98
+ await shardStorage.close();
99
+ this.storage.delete(shardId);
100
+ }
101
+ // Remove from router
102
+ this.router.unregisterConnection(shardId);
103
+ // Remove from shards map
104
+ this.shards.delete(shardId);
105
+ return ok(undefined);
106
+ }
107
+ catch (error) {
108
+ return err(new ShardError(`Failed to remove shard: ${error instanceof Error ? error.message : String(error)}`, shardId, error instanceof Error ? error : undefined));
109
+ }
110
+ }
111
+ /**
112
+ * Get shard info
113
+ */
114
+ getShardInfo(shardId) {
115
+ const info = this.shards.get(shardId);
116
+ if (!info) {
117
+ return err(new ShardNotFoundError(shardId));
118
+ }
119
+ return ok(info);
120
+ }
121
+ /**
122
+ * List all shards
123
+ */
124
+ listShards() {
125
+ return [...this.shards.values()];
126
+ }
127
+ /**
128
+ * Get shard for an entity
129
+ */
130
+ getShardForEntity(entityId) {
131
+ const routingResult = this.router.routeEntityId(entityId);
132
+ if (routingResult.isErr()) {
133
+ return err(routingResult.error);
134
+ }
135
+ return ok(routingResult.value.connection.info);
136
+ }
137
+ /**
138
+ * Get storage for an entity
139
+ */
140
+ getStorageForEntity(entityId) {
141
+ const routingResult = this.router.routeEntityId(entityId);
142
+ if (routingResult.isErr()) {
143
+ return err(routingResult.error);
144
+ }
145
+ const storage = this.storage.get(routingResult.value.shardId);
146
+ if (!storage) {
147
+ return err(new ShardNotFoundError(routingResult.value.shardId));
148
+ }
149
+ return ok(storage);
150
+ }
151
+ /**
152
+ * Start rebalancing
153
+ */
154
+ async startRebalance(options) {
155
+ const jobId = `rebalance-${Date.now()}`;
156
+ const job = {
157
+ jobId,
158
+ status: 'pending',
159
+ progress: 0,
160
+ entitiesMoved: 0,
161
+ startedAt: new Date(),
162
+ };
163
+ this.rebalanceJobs.set(jobId, job);
164
+ // Mark involved shards as rebalancing
165
+ const targetShards = options?.targetShards ?? [...this.shards.keys()];
166
+ for (const shardId of targetShards) {
167
+ this.updateShardStatus(shardId, 'rebalancing');
168
+ }
169
+ // Start rebalance in background
170
+ this.executeRebalance(jobId, options).catch((error) => {
171
+ const failedJob = {
172
+ ...job,
173
+ status: 'failed',
174
+ error: error instanceof Error ? error.message : String(error),
175
+ completedAt: new Date(),
176
+ };
177
+ this.rebalanceJobs.set(jobId, failedJob);
178
+ });
179
+ return ok(job);
180
+ }
181
+ /**
182
+ * Execute rebalance operation
183
+ */
184
+ async executeRebalance(jobId, _options) {
185
+ const job = this.rebalanceJobs.get(jobId);
186
+ // Update status
187
+ const runningJob = {
188
+ ...job,
189
+ status: 'running',
190
+ };
191
+ this.rebalanceJobs.set(jobId, runningJob);
192
+ // TODO: Implement actual rebalancing logic
193
+ // 1. Calculate target distribution
194
+ // 2. Identify entities to move
195
+ // 3. Move entities in batches
196
+ // 4. Update routing
197
+ // Mark as completed
198
+ const completedJob = {
199
+ ...runningJob,
200
+ status: 'completed',
201
+ progress: 100,
202
+ completedAt: new Date(),
203
+ };
204
+ this.rebalanceJobs.set(jobId, completedJob);
205
+ // Reset shard status
206
+ for (const shardId of this.shards.keys()) {
207
+ const info = this.shards.get(shardId);
208
+ if (info.status === 'rebalancing') {
209
+ this.updateShardStatus(shardId, 'active');
210
+ }
211
+ }
212
+ }
213
+ /**
214
+ * Get rebalance status
215
+ */
216
+ getRebalanceStatus(jobId) {
217
+ const job = this.rebalanceJobs.get(jobId);
218
+ if (!job) {
219
+ return err(new RebalanceError(`Rebalance job not found: ${jobId}`, jobId));
220
+ }
221
+ return ok(job);
222
+ }
223
+ /**
224
+ * Cancel rebalance
225
+ */
226
+ async cancelRebalance(jobId) {
227
+ const job = this.rebalanceJobs.get(jobId);
228
+ if (!job) {
229
+ return err(new RebalanceError(`Rebalance job not found: ${jobId}`, jobId));
230
+ }
231
+ if (job.status !== 'running' && job.status !== 'pending') {
232
+ return err(new RebalanceError(`Cannot cancel job in status: ${job.status}`, jobId));
233
+ }
234
+ const cancelledJob = {
235
+ ...job,
236
+ status: 'cancelled',
237
+ completedAt: new Date(),
238
+ };
239
+ this.rebalanceJobs.set(jobId, cancelledJob);
240
+ return ok(undefined);
241
+ }
242
+ /**
243
+ * Check health of all shards
244
+ */
245
+ async checkHealth() {
246
+ const results = new Map();
247
+ for (const [shardId, storage] of this.storage) {
248
+ const startTime = Date.now();
249
+ let healthy = true;
250
+ let errorRate = 0;
251
+ try {
252
+ // Simple health check - get entity count
253
+ await storage.getEntityCount();
254
+ }
255
+ catch {
256
+ healthy = false;
257
+ errorRate = 1;
258
+ }
259
+ const latencyMs = Date.now() - startTime;
260
+ const health = {
261
+ healthy,
262
+ latencyMs,
263
+ errorRate,
264
+ lastChecked: new Date(),
265
+ };
266
+ results.set(shardId, health);
267
+ // Update shard info
268
+ const info = this.shards.get(shardId);
269
+ if (info) {
270
+ this.shards.set(shardId, { ...info, health });
271
+ }
272
+ }
273
+ return results;
274
+ }
275
+ /**
276
+ * Repair a shard
277
+ */
278
+ async repairShard(shardId) {
279
+ const storage = this.storage.get(shardId);
280
+ if (!storage) {
281
+ return err(new ShardNotFoundError(shardId));
282
+ }
283
+ // TODO: Implement repair logic
284
+ // 1. Validate data integrity
285
+ // 2. Rebuild indexes if needed
286
+ // 3. Recover from WAL if available
287
+ return ok(undefined);
288
+ }
289
+ /**
290
+ * Get the router
291
+ */
292
+ getRouter() {
293
+ return this.router;
294
+ }
295
+ /**
296
+ * Get storage for a shard
297
+ */
298
+ getStorage(shardId) {
299
+ return this.storage.get(shardId);
300
+ }
301
+ /**
302
+ * Close all shards
303
+ */
304
+ async close() {
305
+ this.stopHealthCheck();
306
+ for (const storage of this.storage.values()) {
307
+ await storage.close();
308
+ }
309
+ this.storage.clear();
310
+ this.shards.clear();
311
+ }
312
+ /**
313
+ * Update shard status
314
+ */
315
+ updateShardStatus(shardId, status) {
316
+ const info = this.shards.get(shardId);
317
+ if (info) {
318
+ this.shards.set(shardId, { ...info, status, lastModified: new Date() });
319
+ }
320
+ }
321
+ /**
322
+ * Create a connection object for router
323
+ */
324
+ createConnection(info) {
325
+ const self = this;
326
+ return {
327
+ shardId: info.shardId,
328
+ info,
329
+ isHealthy() {
330
+ const current = self.shards.get(info.shardId);
331
+ return current?.health.healthy ?? false;
332
+ },
333
+ };
334
+ }
335
+ /**
336
+ * Start health check interval
337
+ */
338
+ startHealthCheck() {
339
+ this.healthCheckInterval = setInterval(async () => {
340
+ await this.checkHealth();
341
+ }, 30000); // Check every 30 seconds
342
+ }
343
+ /**
344
+ * Stop health check interval
345
+ */
346
+ stopHealthCheck() {
347
+ if (this.healthCheckInterval) {
348
+ clearInterval(this.healthCheckInterval);
349
+ this.healthCheckInterval = undefined;
350
+ }
351
+ }
352
+ }
353
+ //# sourceMappingURL=ShardManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShardManager.js","sourceRoot":"","sources":["../../src/shard/ShardManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @nahisaho/yata-scale - Shard Router
3
+ *
4
+ * Routes operations to appropriate shards based on partition strategy
5
+ */
6
+ import { type Result } from 'neverthrow';
7
+ import type { PartitionStrategy, PartitionStrategyType, ShardInfo, Entity, Relationship, GraphQuery } from '../types.js';
8
+ import { ShardNotFoundError, ShardUnavailableError } from '../errors.js';
9
+ import { type RangeConfig } from './RangePartitionStrategy.js';
10
+ /**
11
+ * Shard connection interface
12
+ */
13
+ export interface ShardConnection {
14
+ readonly shardId: string;
15
+ readonly info: ShardInfo;
16
+ isHealthy(): boolean;
17
+ }
18
+ /**
19
+ * Routing result
20
+ */
21
+ export interface RoutingResult {
22
+ readonly shardId: string;
23
+ readonly connection: ShardConnection;
24
+ }
25
+ /**
26
+ * Multi-shard routing result
27
+ */
28
+ export interface MultiRoutingResult {
29
+ readonly routings: Map<string, RoutingResult>;
30
+ readonly unroutable: string[];
31
+ }
32
+ /**
33
+ * Shard router for directing operations to appropriate shards
34
+ */
35
+ export declare class ShardRouter {
36
+ private strategy;
37
+ private connections;
38
+ constructor(strategyType: PartitionStrategyType, shardIds: string[], options?: {
39
+ rangeConfigs?: RangeConfig[];
40
+ });
41
+ /**
42
+ * Create partition strategy
43
+ */
44
+ private createStrategy;
45
+ /**
46
+ * Register a shard connection
47
+ */
48
+ registerConnection(connection: ShardConnection): void;
49
+ /**
50
+ * Unregister a shard connection
51
+ */
52
+ unregisterConnection(shardId: string): void;
53
+ /**
54
+ * Route a single entity to its shard
55
+ */
56
+ routeEntity(entity: Entity): Result<RoutingResult, ShardNotFoundError | ShardUnavailableError>;
57
+ /**
58
+ * Route an entity ID to its shard
59
+ */
60
+ routeEntityId(entityId: string): Result<RoutingResult, ShardNotFoundError | ShardUnavailableError>;
61
+ /**
62
+ * Route multiple entities to their shards
63
+ */
64
+ routeEntities(entities: Entity[]): MultiRoutingResult;
65
+ /**
66
+ * Route a relationship to its shard (based on source entity)
67
+ */
68
+ routeRelationship(relationship: Relationship): Result<RoutingResult, ShardNotFoundError | ShardUnavailableError>;
69
+ /**
70
+ * Get shards for a query
71
+ */
72
+ getShardsForQuery(query: GraphQuery): string[];
73
+ /**
74
+ * Get routing for a shard ID
75
+ */
76
+ private getRouting;
77
+ /**
78
+ * Check if a shard is available
79
+ */
80
+ private isShardAvailable;
81
+ /**
82
+ * Get all available shards
83
+ */
84
+ private getAllAvailableShards;
85
+ /**
86
+ * Get the partition strategy
87
+ */
88
+ getStrategy(): PartitionStrategy;
89
+ /**
90
+ * Get all registered connections
91
+ */
92
+ getConnections(): Map<string, ShardConnection>;
93
+ /**
94
+ * Get healthy shard count
95
+ */
96
+ getHealthyShardCount(): number;
97
+ /**
98
+ * Get total shard count
99
+ */
100
+ getTotalShardCount(): number;
101
+ }
102
+ //# sourceMappingURL=ShardRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShardRouter.d.ts","sourceRoot":"","sources":["../../src/shard/ShardRouter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,MAAM,EACN,YAAY,EACZ,UAAU,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAGvF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,SAAS,IAAI,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,WAAW,CAA2C;gBAG5D,YAAY,EAAE,qBAAqB,EACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;KAAE;IAK5C;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAIrD;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3C;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,kBAAkB,GAAG,qBAAqB,CAAC;IAK9F;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,kBAAkB,GAAG,qBAAqB,CAAC;IAKlG;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,kBAAkB;IAqBrD;;OAEG;IACH,iBAAiB,CACf,YAAY,EAAE,YAAY,GACzB,MAAM,CAAC,aAAa,EAAE,kBAAkB,GAAG,qBAAqB,CAAC;IAMpE;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE;IA0B9C;;OAEG;IACH,OAAO,CAAC,UAAU;IAgBlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;OAEG;IACH,WAAW,IAAI,iBAAiB;IAIhC;;OAEG;IACH,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAI9C;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAU9B;;OAEG;IACH,kBAAkB,IAAI,MAAM;CAG7B"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * @nahisaho/yata-scale - Shard Router
3
+ *
4
+ * Routes operations to appropriate shards based on partition strategy
5
+ */
6
+ import { ok, err } from 'neverthrow';
7
+ import { ShardNotFoundError, ShardUnavailableError } from '../errors.js';
8
+ import { HashPartitionStrategy } from './HashPartitionStrategy.js';
9
+ import { RangePartitionStrategy } from './RangePartitionStrategy.js';
10
+ import { GraphPartitionStrategy } from './GraphPartitionStrategy.js';
11
+ /**
12
+ * Shard router for directing operations to appropriate shards
13
+ */
14
+ export class ShardRouter {
15
+ strategy;
16
+ connections = new Map();
17
+ constructor(strategyType, shardIds, options) {
18
+ this.strategy = this.createStrategy(strategyType, shardIds, options);
19
+ }
20
+ /**
21
+ * Create partition strategy
22
+ */
23
+ createStrategy(type, shardIds, options) {
24
+ switch (type) {
25
+ case 'hash':
26
+ return new HashPartitionStrategy(shardIds);
27
+ case 'range':
28
+ if (!options?.rangeConfigs) {
29
+ throw new Error('Range configs required for range partition strategy');
30
+ }
31
+ return new RangePartitionStrategy(options.rangeConfigs);
32
+ case 'graph':
33
+ return new GraphPartitionStrategy(shardIds);
34
+ default:
35
+ throw new Error(`Unknown partition strategy: ${type}`);
36
+ }
37
+ }
38
+ /**
39
+ * Register a shard connection
40
+ */
41
+ registerConnection(connection) {
42
+ this.connections.set(connection.shardId, connection);
43
+ }
44
+ /**
45
+ * Unregister a shard connection
46
+ */
47
+ unregisterConnection(shardId) {
48
+ this.connections.delete(shardId);
49
+ }
50
+ /**
51
+ * Route a single entity to its shard
52
+ */
53
+ routeEntity(entity) {
54
+ const shardId = this.strategy.getShardId(entity.id, entity.metadata);
55
+ return this.getRouting(shardId);
56
+ }
57
+ /**
58
+ * Route an entity ID to its shard
59
+ */
60
+ routeEntityId(entityId) {
61
+ const shardId = this.strategy.getShardId(entityId);
62
+ return this.getRouting(shardId);
63
+ }
64
+ /**
65
+ * Route multiple entities to their shards
66
+ */
67
+ routeEntities(entities) {
68
+ const routings = new Map();
69
+ const unroutable = [];
70
+ const entityIds = entities.map((e) => e.id);
71
+ const shardMap = this.strategy.getShardIds(entityIds);
72
+ for (const entity of entities) {
73
+ const shardId = shardMap.get(entity.id);
74
+ const result = this.getRouting(shardId);
75
+ if (result.isOk()) {
76
+ routings.set(entity.id, result.value);
77
+ }
78
+ else {
79
+ unroutable.push(entity.id);
80
+ }
81
+ }
82
+ return { routings, unroutable };
83
+ }
84
+ /**
85
+ * Route a relationship to its shard (based on source entity)
86
+ */
87
+ routeRelationship(relationship) {
88
+ // Route based on source entity for consistency
89
+ const shardId = this.strategy.getShardId(relationship.sourceId);
90
+ return this.getRouting(shardId);
91
+ }
92
+ /**
93
+ * Get shards for a query
94
+ */
95
+ getShardsForQuery(query) {
96
+ // If specific entity IDs are requested, route to those shards
97
+ if (query.entityFilters?.ids && query.entityFilters.ids.length > 0) {
98
+ const shardSet = new Set();
99
+ const shardMap = this.strategy.getShardIds(query.entityFilters.ids);
100
+ for (const shardId of shardMap.values()) {
101
+ if (this.isShardAvailable(shardId)) {
102
+ shardSet.add(shardId);
103
+ }
104
+ }
105
+ return [...shardSet];
106
+ }
107
+ // If traversal starts from a specific node, start there
108
+ if (query.traversal?.startId) {
109
+ const shardId = this.strategy.getShardId(query.traversal.startId);
110
+ if (this.isShardAvailable(shardId)) {
111
+ // For traversals, we may need to query all shards as edges cross boundaries
112
+ return this.getAllAvailableShards();
113
+ }
114
+ }
115
+ // Otherwise, query all available shards
116
+ return this.getAllAvailableShards();
117
+ }
118
+ /**
119
+ * Get routing for a shard ID
120
+ */
121
+ getRouting(shardId) {
122
+ const connection = this.connections.get(shardId);
123
+ if (!connection) {
124
+ return err(new ShardNotFoundError(shardId));
125
+ }
126
+ if (!connection.isHealthy()) {
127
+ return err(new ShardUnavailableError(shardId));
128
+ }
129
+ return ok({ shardId, connection });
130
+ }
131
+ /**
132
+ * Check if a shard is available
133
+ */
134
+ isShardAvailable(shardId) {
135
+ const connection = this.connections.get(shardId);
136
+ return connection !== undefined && connection.isHealthy();
137
+ }
138
+ /**
139
+ * Get all available shards
140
+ */
141
+ getAllAvailableShards() {
142
+ const available = [];
143
+ for (const [shardId, connection] of this.connections) {
144
+ if (connection.isHealthy()) {
145
+ available.push(shardId);
146
+ }
147
+ }
148
+ return available;
149
+ }
150
+ /**
151
+ * Get the partition strategy
152
+ */
153
+ getStrategy() {
154
+ return this.strategy;
155
+ }
156
+ /**
157
+ * Get all registered connections
158
+ */
159
+ getConnections() {
160
+ return new Map(this.connections);
161
+ }
162
+ /**
163
+ * Get healthy shard count
164
+ */
165
+ getHealthyShardCount() {
166
+ let count = 0;
167
+ for (const connection of this.connections.values()) {
168
+ if (connection.isHealthy()) {
169
+ count++;
170
+ }
171
+ }
172
+ return count;
173
+ }
174
+ /**
175
+ * Get total shard count
176
+ */
177
+ getTotalShardCount() {
178
+ return this.connections.size;
179
+ }
180
+ }
181
+ //# sourceMappingURL=ShardRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShardRouter.js","sourceRoot":"","sources":["../../src/shard/ShardRouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @nahisaho/yata-scale - Shard Module
3
+ *
4
+ * Exports for shard management functionality
5
+ */
6
+ export { ShardManager } from './ShardManager.js';
7
+ export { HashPartitionStrategy } from './HashPartitionStrategy.js';
8
+ export { RangePartitionStrategy } from './RangePartitionStrategy.js';
9
+ export { GraphPartitionStrategy } from './GraphPartitionStrategy.js';
10
+ export { ShardRouter } from './ShardRouter.js';
11
+ export { Rebalancer } from './Rebalancer.js';
12
+ export type { ShardConfig, ShardInfo, ShardStatus, ShardHealth, ShardLocation, PartitionStrategy, PartitionStrategyType, RebalanceOptions, RebalanceJob, } from '../types.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shard/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,YAAY,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAC"}