lokicms-plugin-sql 1.0.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/federation/cache-layer.d.ts +58 -0
- package/dist/federation/cache-layer.d.ts.map +1 -0
- package/dist/federation/cache-layer.js +210 -0
- package/dist/federation/cache-layer.js.map +1 -0
- package/dist/federation/index.d.ts +12 -0
- package/dist/federation/index.d.ts.map +1 -0
- package/dist/federation/index.js +9 -0
- package/dist/federation/index.js.map +1 -0
- package/dist/federation/source-manager.d.ts +57 -0
- package/dist/federation/source-manager.d.ts.map +1 -0
- package/dist/federation/source-manager.js +238 -0
- package/dist/federation/source-manager.js.map +1 -0
- package/dist/federation/sync-engine.d.ts +68 -0
- package/dist/federation/sync-engine.d.ts.map +1 -0
- package/dist/federation/sync-engine.js +288 -0
- package/dist/federation/sync-engine.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +28 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +798 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/base.d.ts +142 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +161 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/index.d.ts +22 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +74 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mariadb.d.ts +83 -0
- package/dist/providers/mariadb.d.ts.map +1 -0
- package/dist/providers/mariadb.js +293 -0
- package/dist/providers/mariadb.js.map +1 -0
- package/dist/providers/mysql.d.ts +78 -0
- package/dist/providers/mysql.d.ts.map +1 -0
- package/dist/providers/mysql.js +284 -0
- package/dist/providers/mysql.js.map +1 -0
- package/dist/providers/postgresql.d.ts +77 -0
- package/dist/providers/postgresql.d.ts.map +1 -0
- package/dist/providers/postgresql.js +296 -0
- package/dist/providers/postgresql.js.map +1 -0
- package/dist/providers/sqlite.d.ts +80 -0
- package/dist/providers/sqlite.d.ts.map +1 -0
- package/dist/providers/sqlite.js +283 -0
- package/dist/providers/sqlite.js.map +1 -0
- package/dist/query/builder.d.ts +74 -0
- package/dist/query/builder.d.ts.map +1 -0
- package/dist/query/builder.js +279 -0
- package/dist/query/builder.js.map +1 -0
- package/dist/query/index.d.ts +10 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +8 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/transformer.d.ts +74 -0
- package/dist/query/transformer.d.ts.map +1 -0
- package/dist/query/transformer.js +236 -0
- package/dist/query/transformer.js.map +1 -0
- package/dist/types.d.ts +350 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +38 -0
- package/dist/types.js.map +1 -0
- package/dist/vectors/adapter.d.ts +128 -0
- package/dist/vectors/adapter.d.ts.map +1 -0
- package/dist/vectors/adapter.js +79 -0
- package/dist/vectors/adapter.js.map +1 -0
- package/dist/vectors/index.d.ts +41 -0
- package/dist/vectors/index.d.ts.map +1 -0
- package/dist/vectors/index.js +87 -0
- package/dist/vectors/index.js.map +1 -0
- package/dist/vectors/lokijs-vector.d.ts +112 -0
- package/dist/vectors/lokijs-vector.d.ts.map +1 -0
- package/dist/vectors/lokijs-vector.js +217 -0
- package/dist/vectors/lokijs-vector.js.map +1 -0
- package/dist/vectors/mariadb-vector.d.ts +56 -0
- package/dist/vectors/mariadb-vector.d.ts.map +1 -0
- package/dist/vectors/mariadb-vector.js +263 -0
- package/dist/vectors/mariadb-vector.js.map +1 -0
- package/dist/vectors/mysql-vector.d.ts +56 -0
- package/dist/vectors/mysql-vector.d.ts.map +1 -0
- package/dist/vectors/mysql-vector.js +235 -0
- package/dist/vectors/mysql-vector.js.map +1 -0
- package/dist/vectors/pgvector.d.ts +52 -0
- package/dist/vectors/pgvector.d.ts.map +1 -0
- package/dist/vectors/pgvector.js +190 -0
- package/dist/vectors/pgvector.js.map +1 -0
- package/dist/vectors/sqlite-vec.d.ts +80 -0
- package/dist/vectors/sqlite-vec.d.ts.map +1 -0
- package/dist/vectors/sqlite-vec.js +362 -0
- package/dist/vectors/sqlite-vec.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Layer
|
|
3
|
+
*
|
|
4
|
+
* LokiJS cache layer for SQL queries with TTL support.
|
|
5
|
+
*/
|
|
6
|
+
import type { CacheConfig, CacheStats, PluginLogger } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* LokiJS collection interface (minimal)
|
|
9
|
+
*/
|
|
10
|
+
interface LokiCollection<T = Record<string, unknown>> {
|
|
11
|
+
insert(doc: T): T;
|
|
12
|
+
update(doc: T): T;
|
|
13
|
+
findOne(query: object): T | null;
|
|
14
|
+
find(query?: object): T[];
|
|
15
|
+
remove(doc: T | T[]): void;
|
|
16
|
+
clear(): void;
|
|
17
|
+
count(): number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* LokiJS database interface (minimal)
|
|
21
|
+
*/
|
|
22
|
+
interface LokiDatabase {
|
|
23
|
+
getCollection<T>(name: string): LokiCollection<T> | null;
|
|
24
|
+
addCollection<T>(name: string, options?: object): LokiCollection<T>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Cache layer interface
|
|
28
|
+
*/
|
|
29
|
+
export interface CacheLayer {
|
|
30
|
+
/** Get cached value */
|
|
31
|
+
get<T = unknown>(key: string): T | undefined;
|
|
32
|
+
/** Set cached value */
|
|
33
|
+
set<T = unknown>(key: string, value: T, ttlMinutes?: number): void;
|
|
34
|
+
/** Check if key exists and is valid */
|
|
35
|
+
has(key: string): boolean;
|
|
36
|
+
/** Delete cached value */
|
|
37
|
+
delete(key: string): boolean;
|
|
38
|
+
/** Clear all cache */
|
|
39
|
+
clear(): void;
|
|
40
|
+
/** Clear cache for a collection */
|
|
41
|
+
clearCollection(collection: string): number;
|
|
42
|
+
/** Get cache stats */
|
|
43
|
+
getStats(): CacheStats;
|
|
44
|
+
/** Enable/disable cache */
|
|
45
|
+
setEnabled(enabled: boolean): void;
|
|
46
|
+
/** Check if enabled */
|
|
47
|
+
isEnabled(): boolean;
|
|
48
|
+
/** Cleanup expired entries */
|
|
49
|
+
cleanup(): number;
|
|
50
|
+
/** Generate cache key */
|
|
51
|
+
generateKey(collection: string, query: object): string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create cache layer
|
|
55
|
+
*/
|
|
56
|
+
export declare function createCacheLayer(lokiDb: LokiDatabase, config: CacheConfig, logger: PluginLogger): CacheLayer;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=cache-layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-layer.d.ts","sourceRoot":"","sources":["../../src/federation/cache-layer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EAEX,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,UAAU,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClD,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAC3B,KAAK,IAAI,IAAI,CAAC;IACd,KAAK,IAAI,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,UAAU,YAAY;IACpB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACzD,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;CACrE;AASD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uBAAuB;IACvB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAE7C,uBAAuB;IACvB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnE,uCAAuC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE1B,0BAA0B;IAC1B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B,sBAAsB;IACtB,KAAK,IAAI,IAAI,CAAC;IAEd,mCAAmC;IACnC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5C,sBAAsB;IACtB,QAAQ,IAAI,UAAU,CAAC;IAEvB,2BAA2B;IAC3B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAEnC,uBAAuB;IACvB,SAAS,IAAI,OAAO,CAAC;IAErB,8BAA8B;IAC9B,OAAO,IAAI,MAAM,CAAC;IAElB,yBAAyB;IACzB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,YAAY,GACnB,UAAU,CA2OZ"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Layer
|
|
3
|
+
*
|
|
4
|
+
* LokiJS cache layer for SQL queries with TTL support.
|
|
5
|
+
*/
|
|
6
|
+
import { DEFAULT_CACHE_TTL } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create cache layer
|
|
9
|
+
*/
|
|
10
|
+
export function createCacheLayer(lokiDb, config, logger) {
|
|
11
|
+
const collectionName = 'lokicms_cache';
|
|
12
|
+
const ttlMinutes = config.ttlMinutes ?? DEFAULT_CACHE_TTL;
|
|
13
|
+
const enabledCollections = config.collections ?? []; // Empty = all
|
|
14
|
+
let enabled = config.enabled;
|
|
15
|
+
let hits = 0;
|
|
16
|
+
let misses = 0;
|
|
17
|
+
// Get or create cache collection
|
|
18
|
+
let cacheCollection = lokiDb.getCollection(collectionName);
|
|
19
|
+
if (!cacheCollection) {
|
|
20
|
+
cacheCollection = lokiDb.addCollection(collectionName, {
|
|
21
|
+
indices: ['key'],
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if collection is cacheable
|
|
26
|
+
*/
|
|
27
|
+
function isCacheable(key) {
|
|
28
|
+
if (!enabled)
|
|
29
|
+
return false;
|
|
30
|
+
if (enabledCollections.length === 0)
|
|
31
|
+
return true;
|
|
32
|
+
// Extract collection from key (format: collection:hash)
|
|
33
|
+
const collection = key.split(':')[0];
|
|
34
|
+
return enabledCollections.includes(collection);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get cached value
|
|
38
|
+
*/
|
|
39
|
+
function get(key) {
|
|
40
|
+
if (!isCacheable(key)) {
|
|
41
|
+
misses++;
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
const entry = cacheCollection.findOne({ key });
|
|
45
|
+
if (!entry) {
|
|
46
|
+
misses++;
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
// Check expiration
|
|
50
|
+
if (entry.expiresAt < Date.now()) {
|
|
51
|
+
cacheCollection.remove(entry);
|
|
52
|
+
misses++;
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
hits++;
|
|
56
|
+
return entry.value;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Set cached value
|
|
60
|
+
*/
|
|
61
|
+
function set(key, value, customTtl) {
|
|
62
|
+
if (!isCacheable(key))
|
|
63
|
+
return;
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
const ttl = customTtl ?? ttlMinutes;
|
|
66
|
+
const expiresAt = now + ttl * 60 * 1000;
|
|
67
|
+
const existing = cacheCollection.findOne({ key });
|
|
68
|
+
if (existing) {
|
|
69
|
+
existing.value = value;
|
|
70
|
+
existing.expiresAt = expiresAt;
|
|
71
|
+
cacheCollection.update(existing);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
cacheCollection.insert({
|
|
75
|
+
key,
|
|
76
|
+
value,
|
|
77
|
+
expiresAt,
|
|
78
|
+
createdAt: now,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if key exists and is valid
|
|
84
|
+
*/
|
|
85
|
+
function has(key) {
|
|
86
|
+
if (!isCacheable(key))
|
|
87
|
+
return false;
|
|
88
|
+
const entry = cacheCollection.findOne({ key });
|
|
89
|
+
if (!entry)
|
|
90
|
+
return false;
|
|
91
|
+
if (entry.expiresAt < Date.now()) {
|
|
92
|
+
cacheCollection.remove(entry);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Delete cached value
|
|
99
|
+
*/
|
|
100
|
+
function deleteKey(key) {
|
|
101
|
+
const entry = cacheCollection.findOne({ key });
|
|
102
|
+
if (entry) {
|
|
103
|
+
cacheCollection.remove(entry);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Clear all cache
|
|
110
|
+
*/
|
|
111
|
+
function clearAll() {
|
|
112
|
+
cacheCollection.clear();
|
|
113
|
+
hits = 0;
|
|
114
|
+
misses = 0;
|
|
115
|
+
logger.info('Cache cleared');
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Clear cache for a collection
|
|
119
|
+
*/
|
|
120
|
+
function clearCollection(collection) {
|
|
121
|
+
const entries = cacheCollection.find().filter((e) => e.key.startsWith(`${collection}:`));
|
|
122
|
+
for (const entry of entries) {
|
|
123
|
+
cacheCollection.remove(entry);
|
|
124
|
+
}
|
|
125
|
+
return entries.length;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get cache stats
|
|
129
|
+
*/
|
|
130
|
+
function getStats() {
|
|
131
|
+
const entries = cacheCollection.count();
|
|
132
|
+
const allEntries = cacheCollection.find();
|
|
133
|
+
// Calculate approximate size (rough estimate)
|
|
134
|
+
let size = 0;
|
|
135
|
+
for (const entry of allEntries) {
|
|
136
|
+
size += JSON.stringify(entry.value).length;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
enabled,
|
|
140
|
+
entries,
|
|
141
|
+
size,
|
|
142
|
+
hits,
|
|
143
|
+
misses,
|
|
144
|
+
ttlMinutes,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Enable/disable cache
|
|
149
|
+
*/
|
|
150
|
+
function setEnabled(value) {
|
|
151
|
+
enabled = value;
|
|
152
|
+
logger.info(`Cache ${enabled ? 'enabled' : 'disabled'}`);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check if enabled
|
|
156
|
+
*/
|
|
157
|
+
function isEnabled() {
|
|
158
|
+
return enabled;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Cleanup expired entries
|
|
162
|
+
*/
|
|
163
|
+
function cleanup() {
|
|
164
|
+
const now = Date.now();
|
|
165
|
+
const expired = cacheCollection.find().filter((e) => e.expiresAt < now);
|
|
166
|
+
for (const entry of expired) {
|
|
167
|
+
cacheCollection.remove(entry);
|
|
168
|
+
}
|
|
169
|
+
if (expired.length > 0) {
|
|
170
|
+
logger.debug(`Cleaned up ${expired.length} expired cache entries`);
|
|
171
|
+
}
|
|
172
|
+
return expired.length;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Generate cache key from collection and query
|
|
176
|
+
*/
|
|
177
|
+
function generateKey(collection, query) {
|
|
178
|
+
// Simple hash of query object
|
|
179
|
+
const queryStr = JSON.stringify(query, Object.keys(query).sort());
|
|
180
|
+
let hash = 0;
|
|
181
|
+
for (let i = 0; i < queryStr.length; i++) {
|
|
182
|
+
const char = queryStr.charCodeAt(i);
|
|
183
|
+
hash = ((hash << 5) - hash) + char;
|
|
184
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
185
|
+
}
|
|
186
|
+
return `${collection}:${Math.abs(hash).toString(36)}`;
|
|
187
|
+
}
|
|
188
|
+
// Start cleanup interval
|
|
189
|
+
const cleanupInterval = setInterval(cleanup, 5 * 60 * 1000); // Every 5 minutes
|
|
190
|
+
// Cleanup on module unload (if possible)
|
|
191
|
+
if (typeof process !== 'undefined') {
|
|
192
|
+
process.on('beforeExit', () => {
|
|
193
|
+
clearInterval(cleanupInterval);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
get,
|
|
198
|
+
set,
|
|
199
|
+
has,
|
|
200
|
+
delete: deleteKey,
|
|
201
|
+
clear: clearAll,
|
|
202
|
+
clearCollection,
|
|
203
|
+
getStats,
|
|
204
|
+
setEnabled,
|
|
205
|
+
isEnabled,
|
|
206
|
+
cleanup,
|
|
207
|
+
generateKey,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=cache-layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-layer.js","sourceRoot":"","sources":["../../src/federation/cache-layer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoEhD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAoB,EACpB,MAAmB,EACnB,MAAoB;IAEpB,MAAM,cAAc,GAAG,eAAe,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAC1D,MAAM,kBAAkB,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,cAAc;IAEnE,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,iCAAiC;IACjC,IAAI,eAAe,GAAG,MAAM,CAAC,aAAa,CAAgB,cAAc,CAAC,CAAC;IAC1E,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,MAAM,CAAC,aAAa,CAAgB,cAAc,EAAE;YACpE,OAAO,EAAE,CAAC,KAAK,CAAC;SACjB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS,WAAW,CAAC,GAAW;QAC9B,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjD,wDAAwD;QACxD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,SAAS,GAAG,CAAc,GAAW;QACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,EAAE,CAAC;YACT,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,eAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAEhD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,EAAE,CAAC;YACT,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,mBAAmB;QACnB,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACjC,eAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,EAAE,CAAC;YACT,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,EAAE,CAAC;QACP,OAAO,KAAK,CAAC,KAAU,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,SAAS,GAAG,CAAc,GAAW,EAAE,KAAQ,EAAE,SAAkB;QACjE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO;QAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,SAAS,IAAI,UAAU,CAAC;QACpC,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;QAExC,MAAM,QAAQ,GAAG,eAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAEnD,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;YACvB,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;YAC/B,eAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,eAAgB,CAAC,MAAM,CAAC;gBACtB,GAAG;gBACH,KAAK;gBACL,SAAS;gBACT,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,GAAG,CAAC,GAAW;QACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEpC,MAAM,KAAK,GAAG,eAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAEhD,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACjC,eAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,SAAS,SAAS,CAAC,GAAW;QAC5B,MAAM,KAAK,GAAG,eAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAEhD,IAAI,KAAK,EAAE,CAAC;YACV,eAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,QAAQ;QACf,eAAgB,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,CAAC;QACT,MAAM,GAAG,CAAC,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,SAAS,eAAe,CAAC,UAAkB;QACzC,MAAM,OAAO,GAAG,eAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACnD,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,CACnC,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,eAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,SAAS,QAAQ;QACf,MAAM,OAAO,GAAG,eAAgB,CAAC,KAAK,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,eAAgB,CAAC,IAAI,EAAE,CAAC;QAE3C,8CAA8C;QAC9C,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QAC7C,CAAC;QAED,OAAO;YACL,OAAO;YACP,OAAO;YACP,IAAI;YACJ,IAAI;YACJ,MAAM;YACN,UAAU;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,SAAS,UAAU,CAAC,KAAc;QAChC,OAAO,GAAG,KAAK,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,SAAS,SAAS;QAChB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,SAAS,OAAO;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,eAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;QAEzE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,eAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,SAAS,WAAW,CAAC,UAAkB,EAAE,KAAa;QACpD,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACnC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,2BAA2B;QACjD,CAAC;QAED,OAAO,GAAG,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IACxD,CAAC;IAED,yBAAyB;IACzB,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB;IAE/E,yCAAyC;IACzC,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;YAC5B,aAAa,CAAC,eAAe,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,GAAG;QACH,GAAG;QACH,GAAG;QACH,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,QAAQ;QACf,eAAe;QACf,QAAQ;QACR,UAAU;QACV,SAAS;QACT,OAAO;QACP,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Federation Layer Index
|
|
3
|
+
*
|
|
4
|
+
* Data federation components for multi-source management.
|
|
5
|
+
*/
|
|
6
|
+
export { createSourceManager } from './source-manager.js';
|
|
7
|
+
export type { SourceManager, ManagedSource } from './source-manager.js';
|
|
8
|
+
export { createSyncEngine } from './sync-engine.js';
|
|
9
|
+
export type { SyncEngine } from './sync-engine.js';
|
|
10
|
+
export { createCacheLayer } from './cache-layer.js';
|
|
11
|
+
export type { CacheLayer } from './cache-layer.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/federation/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Federation Layer Index
|
|
3
|
+
*
|
|
4
|
+
* Data federation components for multi-source management.
|
|
5
|
+
*/
|
|
6
|
+
export { createSourceManager } from './source-manager.js';
|
|
7
|
+
export { createSyncEngine } from './sync-engine.js';
|
|
8
|
+
export { createCacheLayer } from './cache-layer.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/federation/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple data sources with connection pooling and health monitoring.
|
|
5
|
+
*/
|
|
6
|
+
import type { SourceConfig, SQLProviderType, ConnectionMode, ConnectionConfig, ProviderStatus, PluginLogger } from '../types.js';
|
|
7
|
+
import { SQLProvider } from '../providers/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Managed source
|
|
10
|
+
*/
|
|
11
|
+
export interface ManagedSource {
|
|
12
|
+
name: string;
|
|
13
|
+
config: SourceConfig;
|
|
14
|
+
provider: SQLProvider;
|
|
15
|
+
status: 'disconnected' | 'connecting' | 'connected' | 'error';
|
|
16
|
+
error?: string;
|
|
17
|
+
lastConnected?: number;
|
|
18
|
+
lastHealthCheck?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Source manager interface
|
|
22
|
+
*/
|
|
23
|
+
export interface SourceManager {
|
|
24
|
+
/** Add a source */
|
|
25
|
+
addSource(config: SourceConfig): Promise<void>;
|
|
26
|
+
/** Remove a source */
|
|
27
|
+
removeSource(name: string): Promise<void>;
|
|
28
|
+
/** Get a source by name */
|
|
29
|
+
getSource(name: string): ManagedSource | undefined;
|
|
30
|
+
/** Get all sources */
|
|
31
|
+
getAllSources(): ManagedSource[];
|
|
32
|
+
/** Get source provider */
|
|
33
|
+
getProvider(name: string): SQLProvider | undefined;
|
|
34
|
+
/** Connect to a source */
|
|
35
|
+
connect(name: string): Promise<void>;
|
|
36
|
+
/** Disconnect from a source */
|
|
37
|
+
disconnect(name: string): Promise<void>;
|
|
38
|
+
/** Connect to all sources */
|
|
39
|
+
connectAll(): Promise<void>;
|
|
40
|
+
/** Disconnect from all sources */
|
|
41
|
+
disconnectAll(): Promise<void>;
|
|
42
|
+
/** Get source status */
|
|
43
|
+
getStatus(name: string): Promise<ProviderStatus | null>;
|
|
44
|
+
/** Get all statuses */
|
|
45
|
+
getAllStatuses(): Promise<Map<string, ProviderStatus>>;
|
|
46
|
+
/** Health check all sources */
|
|
47
|
+
healthCheck(): Promise<Map<string, boolean>>;
|
|
48
|
+
/** Set primary source */
|
|
49
|
+
setPrimary(provider: SQLProviderType, mode: ConnectionMode, connection: ConnectionConfig): Promise<void>;
|
|
50
|
+
/** Get primary provider */
|
|
51
|
+
getPrimary(): SQLProvider | undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create source manager
|
|
55
|
+
*/
|
|
56
|
+
export declare function createSourceManager(logger: PluginLogger, tablePrefix?: string): SourceManager;
|
|
57
|
+
//# sourceMappingURL=source-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-manager.d.ts","sourceRoot":"","sources":["../../src/federation/source-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAkB,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C,sBAAsB;IACtB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C,2BAA2B;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAEnD,sBAAsB;IACtB,aAAa,IAAI,aAAa,EAAE,CAAC;IAEjC,0BAA0B;IAC1B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAEnD,0BAA0B;IAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,+BAA+B;IAC/B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,6BAA6B;IAC7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,kCAAkC;IAClC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/B,wBAAwB;IACxB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAExD,uBAAuB;IACvB,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAEvD,+BAA+B;IAC/B,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE7C,yBAAyB;IACzB,UAAU,CACR,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,gBAAgB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,2BAA2B;IAC3B,UAAU,IAAI,WAAW,GAAG,SAAS,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,CAqRf"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple data sources with connection pooling and health monitoring.
|
|
5
|
+
*/
|
|
6
|
+
import { createProvider } from '../providers/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create source manager
|
|
9
|
+
*/
|
|
10
|
+
export function createSourceManager(logger, tablePrefix) {
|
|
11
|
+
const sources = new Map();
|
|
12
|
+
let primaryProvider;
|
|
13
|
+
/**
|
|
14
|
+
* Add a source
|
|
15
|
+
*/
|
|
16
|
+
async function addSource(config) {
|
|
17
|
+
if (sources.has(config.name)) {
|
|
18
|
+
throw new Error(`Source '${config.name}' already exists`);
|
|
19
|
+
}
|
|
20
|
+
logger.info(`Adding source: ${config.name} (${config.provider})`);
|
|
21
|
+
const provider = await createProvider(config.provider, config.mode, config.connection, logger, tablePrefix);
|
|
22
|
+
sources.set(config.name, {
|
|
23
|
+
name: config.name,
|
|
24
|
+
config,
|
|
25
|
+
provider,
|
|
26
|
+
status: 'disconnected',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Remove a source
|
|
31
|
+
*/
|
|
32
|
+
async function removeSource(name) {
|
|
33
|
+
const source = sources.get(name);
|
|
34
|
+
if (!source) {
|
|
35
|
+
throw new Error(`Source '${name}' not found`);
|
|
36
|
+
}
|
|
37
|
+
// Disconnect if connected
|
|
38
|
+
if (source.provider.isConnected()) {
|
|
39
|
+
await source.provider.disconnect();
|
|
40
|
+
}
|
|
41
|
+
sources.delete(name);
|
|
42
|
+
logger.info(`Removed source: ${name}`);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get a source
|
|
46
|
+
*/
|
|
47
|
+
function getSource(name) {
|
|
48
|
+
return sources.get(name);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get all sources
|
|
52
|
+
*/
|
|
53
|
+
function getAllSources() {
|
|
54
|
+
return Array.from(sources.values());
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get provider
|
|
58
|
+
*/
|
|
59
|
+
function getProvider(name) {
|
|
60
|
+
return sources.get(name)?.provider;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Connect to a source
|
|
64
|
+
*/
|
|
65
|
+
async function connect(name) {
|
|
66
|
+
const source = sources.get(name);
|
|
67
|
+
if (!source) {
|
|
68
|
+
throw new Error(`Source '${name}' not found`);
|
|
69
|
+
}
|
|
70
|
+
if (source.status === 'connected') {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
source.status = 'connecting';
|
|
74
|
+
try {
|
|
75
|
+
await source.provider.connect();
|
|
76
|
+
source.status = 'connected';
|
|
77
|
+
source.lastConnected = Date.now();
|
|
78
|
+
source.error = undefined;
|
|
79
|
+
logger.info(`Connected to source: ${name}`);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
source.status = 'error';
|
|
83
|
+
source.error = error instanceof Error ? error.message : String(error);
|
|
84
|
+
logger.error(`Failed to connect to source ${name}: ${source.error}`);
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Disconnect from a source
|
|
90
|
+
*/
|
|
91
|
+
async function disconnect(name) {
|
|
92
|
+
const source = sources.get(name);
|
|
93
|
+
if (!source) {
|
|
94
|
+
throw new Error(`Source '${name}' not found`);
|
|
95
|
+
}
|
|
96
|
+
if (source.status === 'disconnected') {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
await source.provider.disconnect();
|
|
101
|
+
source.status = 'disconnected';
|
|
102
|
+
logger.info(`Disconnected from source: ${name}`);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
logger.error(`Error disconnecting from source ${name}: ${error}`);
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Connect to all sources
|
|
111
|
+
*/
|
|
112
|
+
async function connectAll() {
|
|
113
|
+
const promises = Array.from(sources.keys()).map(async (name) => {
|
|
114
|
+
try {
|
|
115
|
+
await connect(name);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Logged in connect()
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
await Promise.all(promises);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Disconnect from all sources
|
|
125
|
+
*/
|
|
126
|
+
async function disconnectAll() {
|
|
127
|
+
const promises = Array.from(sources.keys()).map(async (name) => {
|
|
128
|
+
try {
|
|
129
|
+
await disconnect(name);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Logged in disconnect()
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
await Promise.all(promises);
|
|
136
|
+
// Also disconnect primary
|
|
137
|
+
if (primaryProvider?.isConnected()) {
|
|
138
|
+
await primaryProvider.disconnect();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get source status
|
|
143
|
+
*/
|
|
144
|
+
async function getStatus(name) {
|
|
145
|
+
const source = sources.get(name);
|
|
146
|
+
if (!source) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
if (source.provider.isConnected()) {
|
|
150
|
+
return source.provider.getStatus();
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
connected: false,
|
|
154
|
+
provider: source.config.provider,
|
|
155
|
+
mode: source.config.mode,
|
|
156
|
+
capabilities: {
|
|
157
|
+
json: false,
|
|
158
|
+
vectors: false,
|
|
159
|
+
fullText: false,
|
|
160
|
+
transactions: false,
|
|
161
|
+
},
|
|
162
|
+
error: source.error,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get all statuses
|
|
167
|
+
*/
|
|
168
|
+
async function getAllStatuses() {
|
|
169
|
+
const statuses = new Map();
|
|
170
|
+
for (const name of sources.keys()) {
|
|
171
|
+
const status = await getStatus(name);
|
|
172
|
+
if (status) {
|
|
173
|
+
statuses.set(name, status);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return statuses;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Health check all sources
|
|
180
|
+
*/
|
|
181
|
+
async function healthCheck() {
|
|
182
|
+
const results = new Map();
|
|
183
|
+
for (const [name, source] of sources) {
|
|
184
|
+
try {
|
|
185
|
+
if (source.provider.isConnected()) {
|
|
186
|
+
// Try a simple query
|
|
187
|
+
await source.provider.query('SELECT 1');
|
|
188
|
+
results.set(name, true);
|
|
189
|
+
source.lastHealthCheck = Date.now();
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
results.set(name, false);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
results.set(name, false);
|
|
197
|
+
source.status = 'error';
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return results;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Set primary source
|
|
204
|
+
*/
|
|
205
|
+
async function setPrimary(provider, mode, connection) {
|
|
206
|
+
// Disconnect existing primary
|
|
207
|
+
if (primaryProvider?.isConnected()) {
|
|
208
|
+
await primaryProvider.disconnect();
|
|
209
|
+
}
|
|
210
|
+
// Create new primary
|
|
211
|
+
primaryProvider = await createProvider(provider, mode, connection, logger, tablePrefix);
|
|
212
|
+
await primaryProvider.connect();
|
|
213
|
+
logger.info(`Primary source set: ${provider} (${mode})`);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get primary provider
|
|
217
|
+
*/
|
|
218
|
+
function getPrimary() {
|
|
219
|
+
return primaryProvider;
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
addSource,
|
|
223
|
+
removeSource,
|
|
224
|
+
getSource,
|
|
225
|
+
getAllSources,
|
|
226
|
+
getProvider,
|
|
227
|
+
connect,
|
|
228
|
+
disconnect,
|
|
229
|
+
connectAll,
|
|
230
|
+
disconnectAll,
|
|
231
|
+
getStatus,
|
|
232
|
+
getAllStatuses,
|
|
233
|
+
healthCheck,
|
|
234
|
+
setPrimary,
|
|
235
|
+
getPrimary,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=source-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-manager.js","sourceRoot":"","sources":["../../src/federation/source-manager.ts"],"names":[],"mappings":"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"}
|