@quereus/sync-coordinator 0.3.5 → 0.3.7

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 (82) hide show
  1. package/README.md +2 -2
  2. package/dist/src/bin/sync-coordinator.d.ts +6 -0
  3. package/dist/src/bin/sync-coordinator.d.ts.map +1 -0
  4. package/dist/src/bin/sync-coordinator.js +85 -0
  5. package/dist/src/bin/sync-coordinator.js.map +1 -0
  6. package/dist/src/common/index.d.ts +5 -0
  7. package/dist/src/common/index.d.ts.map +1 -0
  8. package/dist/src/common/index.js +5 -0
  9. package/dist/src/common/index.js.map +1 -0
  10. package/dist/src/common/logger.d.ts +20 -0
  11. package/dist/src/common/logger.d.ts.map +1 -0
  12. package/dist/src/common/logger.js +24 -0
  13. package/dist/src/common/logger.js.map +1 -0
  14. package/dist/src/config/index.d.ts +6 -0
  15. package/dist/src/config/index.d.ts.map +1 -0
  16. package/dist/src/config/index.js +6 -0
  17. package/dist/src/config/index.js.map +1 -0
  18. package/dist/src/config/loader.d.ts +27 -0
  19. package/dist/src/config/loader.d.ts.map +1 -0
  20. package/dist/src/config/loader.js +144 -0
  21. package/dist/src/config/loader.js.map +1 -0
  22. package/dist/src/config/types.d.ts +74 -0
  23. package/dist/src/config/types.d.ts.map +1 -0
  24. package/dist/src/config/types.js +27 -0
  25. package/dist/src/config/types.js.map +1 -0
  26. package/dist/src/index.d.ts +21 -0
  27. package/dist/src/index.d.ts.map +1 -0
  28. package/dist/src/index.js +26 -0
  29. package/dist/src/index.js.map +1 -0
  30. package/dist/src/metrics/coordinator-metrics.d.ts +27 -0
  31. package/dist/src/metrics/coordinator-metrics.d.ts.map +1 -0
  32. package/dist/src/metrics/coordinator-metrics.js +57 -0
  33. package/dist/src/metrics/coordinator-metrics.js.map +1 -0
  34. package/dist/src/metrics/index.d.ts +7 -0
  35. package/dist/src/metrics/index.d.ts.map +1 -0
  36. package/dist/src/metrics/index.js +7 -0
  37. package/dist/src/metrics/index.js.map +1 -0
  38. package/dist/src/metrics/registry.d.ts +53 -0
  39. package/dist/src/metrics/registry.d.ts.map +1 -0
  40. package/dist/src/metrics/registry.js +158 -0
  41. package/dist/src/metrics/registry.js.map +1 -0
  42. package/dist/src/metrics/types.d.ts +62 -0
  43. package/dist/src/metrics/types.d.ts.map +1 -0
  44. package/dist/src/metrics/types.js +16 -0
  45. package/dist/src/metrics/types.js.map +1 -0
  46. package/dist/src/server/index.d.ts +7 -0
  47. package/dist/src/server/index.d.ts.map +1 -0
  48. package/dist/src/server/index.js +7 -0
  49. package/dist/src/server/index.js.map +1 -0
  50. package/dist/src/server/routes.d.ts +10 -0
  51. package/dist/src/server/routes.d.ts.map +1 -0
  52. package/dist/src/server/routes.js +174 -0
  53. package/dist/src/server/routes.js.map +1 -0
  54. package/dist/src/server/server.d.ts +34 -0
  55. package/dist/src/server/server.d.ts.map +1 -0
  56. package/dist/src/server/server.js +57 -0
  57. package/dist/src/server/server.js.map +1 -0
  58. package/dist/src/server/websocket.d.ts +10 -0
  59. package/dist/src/server/websocket.d.ts.map +1 -0
  60. package/dist/src/server/websocket.js +167 -0
  61. package/dist/src/server/websocket.js.map +1 -0
  62. package/dist/src/service/coordinator-service.d.ts +122 -0
  63. package/dist/src/service/coordinator-service.d.ts.map +1 -0
  64. package/dist/src/service/coordinator-service.js +436 -0
  65. package/dist/src/service/coordinator-service.js.map +1 -0
  66. package/dist/src/service/database-ids.d.ts +58 -0
  67. package/dist/src/service/database-ids.d.ts.map +1 -0
  68. package/dist/src/service/database-ids.js +128 -0
  69. package/dist/src/service/database-ids.js.map +1 -0
  70. package/dist/src/service/index.d.ts +8 -0
  71. package/dist/src/service/index.d.ts.map +1 -0
  72. package/dist/src/service/index.js +7 -0
  73. package/dist/src/service/index.js.map +1 -0
  74. package/dist/src/service/store-manager.d.ts +85 -0
  75. package/dist/src/service/store-manager.d.ts.map +1 -0
  76. package/dist/src/service/store-manager.js +194 -0
  77. package/dist/src/service/store-manager.js.map +1 -0
  78. package/dist/src/service/types.d.ts +146 -0
  79. package/dist/src/service/types.d.ts.map +1 -0
  80. package/dist/src/service/types.js +5 -0
  81. package/dist/src/service/types.js.map +1 -0
  82. package/package.json +4 -3
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @quereus/sync-coordinator
2
2
 
3
- Standalone coordinator backend for [@quereus/plugin-sync](../quereus-plugin-sync) — a production-ready server for multi-master CRDT replication.
3
+ Standalone coordinator backend for [@quereus/sync](../quereus-sync) — a production-ready server for multi-master CRDT replication.
4
4
 
5
5
  ## Features
6
6
 
@@ -153,7 +153,7 @@ npm test # Run tests
153
153
 
154
154
  ## Related Packages
155
155
 
156
- - [`@quereus/plugin-sync`](../quereus-plugin-sync/) - Client-side sync module
156
+ - [`@quereus/sync`](../quereus-sync/) - Client-side sync module
157
157
  - [`@quereus/sync-client`](../quereus-sync-client/) - WebSocket sync client
158
158
  - [`@quereus/store`](../quereus-store/) - Storage base layer
159
159
 
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for sync-coordinator.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=sync-coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-coordinator.d.ts","sourceRoot":"","sources":["../../../src/bin/sync-coordinator.ts"],"names":[],"mappings":";AACA;;GAEG"}
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for sync-coordinator.
4
+ */
5
+ import { Command } from 'commander';
6
+ import debug from 'debug';
7
+ import { loadConfig } from '../config/index.js';
8
+ import { createCoordinatorServer } from '../server/server.js';
9
+ const program = new Command();
10
+ program
11
+ .name('sync-coordinator')
12
+ .description('Standalone coordinator backend for Quereus Sync')
13
+ .version('0.1.0')
14
+ .option('-c, --config <path>', 'Path to config file (JSON)')
15
+ .option('-h, --host <host>', 'Host to bind to')
16
+ .option('-p, --port <port>', 'Port to listen on', parseInt)
17
+ .option('-b, --base-path <path>', 'Base path for all routes')
18
+ .option('-d, --data-dir <dir>', 'Directory for LevelDB data')
19
+ .option('--cors-origin <origins>', 'CORS allowed origins (comma-separated, or "true"/"false")')
20
+ .option('--auth-mode <mode>', 'Authentication mode: none, token-whitelist, custom')
21
+ .option('--auth-tokens <tokens>', 'Comma-separated list of allowed tokens')
22
+ .option('--debug <namespaces>', 'Debug namespaces (e.g., "sync-coordinator:*")')
23
+ .action(async (options) => {
24
+ // Enable debug logging if specified
25
+ if (options.debug) {
26
+ debug.enable(options.debug);
27
+ }
28
+ // Build overrides from CLI options
29
+ const overrides = {};
30
+ if (options.host)
31
+ overrides.host = options.host;
32
+ if (options.port)
33
+ overrides.port = options.port;
34
+ if (options.basePath)
35
+ overrides.basePath = options.basePath;
36
+ if (options.dataDir)
37
+ overrides.dataDir = options.dataDir;
38
+ if (options.corsOrigin) {
39
+ if (options.corsOrigin === 'true') {
40
+ overrides.cors = { origin: true };
41
+ }
42
+ else if (options.corsOrigin === 'false') {
43
+ overrides.cors = { origin: false };
44
+ }
45
+ else {
46
+ overrides.cors = { origin: options.corsOrigin.split(',').map((o) => o.trim()) };
47
+ }
48
+ }
49
+ if (options.authMode) {
50
+ overrides.auth = { mode: options.authMode };
51
+ }
52
+ if (options.authTokens) {
53
+ overrides.auth = overrides.auth || { mode: 'token-whitelist' };
54
+ overrides.auth.tokens = options.authTokens.split(',').map((t) => t.trim());
55
+ }
56
+ // Load configuration
57
+ const config = loadConfig({
58
+ configPath: options.config,
59
+ overrides,
60
+ });
61
+ console.log('Starting sync-coordinator...');
62
+ console.log(` Host: ${config.host}`);
63
+ console.log(` Port: ${config.port}`);
64
+ console.log(` Base path: ${config.basePath}`);
65
+ console.log(` Data dir: ${config.dataDir}`);
66
+ console.log(` Auth mode: ${config.auth.mode}`);
67
+ try {
68
+ const server = await createCoordinatorServer({ config });
69
+ // Handle shutdown signals
70
+ const shutdown = async () => {
71
+ console.log('\nShutting down...');
72
+ await server.stop();
73
+ process.exit(0);
74
+ };
75
+ process.on('SIGINT', shutdown);
76
+ process.on('SIGTERM', shutdown);
77
+ await server.start();
78
+ }
79
+ catch (err) {
80
+ console.error('Failed to start server:', err);
81
+ process.exit(1);
82
+ }
83
+ });
84
+ program.parse();
85
+ //# sourceMappingURL=sync-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-coordinator.js","sourceRoot":"","sources":["../../../src/bin/sync-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Common utilities for sync-coordinator.
3
+ */
4
+ export { createLogger, serverLog, httpLog, wsLog, serviceLog, authLog, configLog, } from './logger.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,SAAS,EACT,OAAO,EACP,KAAK,EACL,UAAU,EACV,OAAO,EACP,SAAS,GACV,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Common utilities for sync-coordinator.
3
+ */
4
+ export { createLogger, serverLog, httpLog, wsLog, serviceLog, authLog, configLog, } from './logger.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,SAAS,EACT,OAAO,EACP,KAAK,EACL,UAAU,EACV,OAAO,EACP,SAAS,GACV,MAAM,aAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Debug logger setup for sync-coordinator.
3
+ *
4
+ * Uses the 'debug' library for configurable, namespace-based logging.
5
+ */
6
+ import debug from 'debug';
7
+ /**
8
+ * Create a namespaced logger.
9
+ *
10
+ * @param namespace - Sub-namespace (e.g., 'server', 'ws', 'service')
11
+ * @returns A debug logger function
12
+ */
13
+ export declare function createLogger(namespace: string): debug.Debugger;
14
+ export declare const serverLog: debug.Debugger;
15
+ export declare const httpLog: debug.Debugger;
16
+ export declare const wsLog: debug.Debugger;
17
+ export declare const serviceLog: debug.Debugger;
18
+ export declare const authLog: debug.Debugger;
19
+ export declare const configLog: debug.Debugger;
20
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/common/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,QAAQ,CAE9D;AAGD,eAAO,MAAM,SAAS,gBAAyB,CAAC;AAChD,eAAO,MAAM,OAAO,gBAAuB,CAAC;AAC5C,eAAO,MAAM,KAAK,gBAAqB,CAAC;AACxC,eAAO,MAAM,UAAU,gBAA0B,CAAC;AAClD,eAAO,MAAM,OAAO,gBAAuB,CAAC;AAC5C,eAAO,MAAM,SAAS,gBAAyB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Debug logger setup for sync-coordinator.
3
+ *
4
+ * Uses the 'debug' library for configurable, namespace-based logging.
5
+ */
6
+ import debug from 'debug';
7
+ const ROOT_NAMESPACE = 'sync-coordinator';
8
+ /**
9
+ * Create a namespaced logger.
10
+ *
11
+ * @param namespace - Sub-namespace (e.g., 'server', 'ws', 'service')
12
+ * @returns A debug logger function
13
+ */
14
+ export function createLogger(namespace) {
15
+ return debug(`${ROOT_NAMESPACE}:${namespace}`);
16
+ }
17
+ // Pre-created loggers for common namespaces
18
+ export const serverLog = createLogger('server');
19
+ export const httpLog = createLogger('http');
20
+ export const wsLog = createLogger('ws');
21
+ export const serviceLog = createLogger('service');
22
+ export const authLog = createLogger('auth');
23
+ export const configLog = createLogger('config');
24
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/common/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,KAAK,CAAC,GAAG,cAAc,IAAI,SAAS,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Configuration module exports.
3
+ */
4
+ export { type CoordinatorConfig, type PartialCoordinatorConfig, type CorsConfig, type AuthConfig, type SyncSettings, type LoggingConfig, DEFAULT_CONFIG, } from './types.js';
5
+ export { loadConfig, loadConfigFile, loadEnvConfig, } from './loader.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Configuration module exports.
3
+ */
4
+ export { DEFAULT_CONFIG, } from './types.js';
5
+ export { loadConfig, loadConfigFile, loadEnvConfig, } from './loader.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAOL,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Configuration loading from multiple sources.
3
+ *
4
+ * Priority (highest to lowest):
5
+ * 1. Programmatic options
6
+ * 2. CLI arguments
7
+ * 3. Environment variables
8
+ * 4. Config file
9
+ * 5. Defaults
10
+ */
11
+ import { type CoordinatorConfig, type PartialCoordinatorConfig } from './types.js';
12
+ /**
13
+ * Load configuration from a JSON file.
14
+ */
15
+ export declare function loadConfigFile(configPath: string): PartialCoordinatorConfig;
16
+ /**
17
+ * Load configuration from environment variables.
18
+ */
19
+ export declare function loadEnvConfig(): PartialCoordinatorConfig;
20
+ /**
21
+ * Load full configuration from all sources.
22
+ */
23
+ export declare function loadConfig(options?: {
24
+ configPath?: string;
25
+ overrides?: PartialCoordinatorConfig;
26
+ }): CoordinatorConfig;
27
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAE9B,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,wBAAwB,CAgB3E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,wBAAwB,CA4DxD;AAkCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,wBAAwB,CAAC;CACjC,GAAG,iBAAiB,CAqBzB"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Configuration loading from multiple sources.
3
+ *
4
+ * Priority (highest to lowest):
5
+ * 1. Programmatic options
6
+ * 2. CLI arguments
7
+ * 3. Environment variables
8
+ * 4. Config file
9
+ * 5. Defaults
10
+ */
11
+ import { readFileSync, existsSync } from 'node:fs';
12
+ import { resolve } from 'node:path';
13
+ import { configLog } from '../common/logger.js';
14
+ import { DEFAULT_CONFIG, } from './types.js';
15
+ /**
16
+ * Load configuration from a JSON file.
17
+ */
18
+ export function loadConfigFile(configPath) {
19
+ const resolved = resolve(configPath);
20
+ if (!existsSync(resolved)) {
21
+ configLog('Config file not found: %s', resolved);
22
+ return {};
23
+ }
24
+ try {
25
+ const content = readFileSync(resolved, 'utf-8');
26
+ const parsed = JSON.parse(content);
27
+ configLog('Loaded config from %s', resolved);
28
+ return parsed;
29
+ }
30
+ catch (err) {
31
+ configLog('Failed to parse config file %s: %O', resolved, err);
32
+ throw new Error(`Failed to parse config file: ${resolved}`);
33
+ }
34
+ }
35
+ /**
36
+ * Load configuration from environment variables.
37
+ */
38
+ export function loadEnvConfig() {
39
+ const config = {};
40
+ if (process.env.SYNC_HOST) {
41
+ config.host = process.env.SYNC_HOST;
42
+ }
43
+ if (process.env.SYNC_PORT) {
44
+ config.port = parseInt(process.env.SYNC_PORT, 10);
45
+ }
46
+ if (process.env.SYNC_BASE_PATH) {
47
+ config.basePath = process.env.SYNC_BASE_PATH;
48
+ }
49
+ if (process.env.SYNC_DATA_DIR) {
50
+ config.dataDir = process.env.SYNC_DATA_DIR;
51
+ }
52
+ // CORS
53
+ if (process.env.SYNC_CORS_ORIGIN) {
54
+ const origins = process.env.SYNC_CORS_ORIGIN;
55
+ if (origins === 'true') {
56
+ config.cors = { origin: true };
57
+ }
58
+ else if (origins === 'false') {
59
+ config.cors = { origin: false };
60
+ }
61
+ else {
62
+ config.cors = { origin: origins.split(',').map(o => o.trim()) };
63
+ }
64
+ }
65
+ if (process.env.SYNC_CORS_CREDENTIALS) {
66
+ config.cors = config.cors || {};
67
+ config.cors.credentials = process.env.SYNC_CORS_CREDENTIALS === 'true';
68
+ }
69
+ // Auth
70
+ if (process.env.SYNC_AUTH_MODE) {
71
+ const mode = process.env.SYNC_AUTH_MODE;
72
+ config.auth = { mode };
73
+ }
74
+ if (process.env.SYNC_AUTH_TOKENS) {
75
+ config.auth = config.auth || { mode: 'token-whitelist' };
76
+ config.auth.tokens = process.env.SYNC_AUTH_TOKENS.split(',').map(t => t.trim());
77
+ }
78
+ // Sync settings
79
+ if (process.env.SYNC_TOMBSTONE_TTL) {
80
+ config.sync = config.sync || {};
81
+ config.sync.tombstoneTTL = parseInt(process.env.SYNC_TOMBSTONE_TTL, 10);
82
+ }
83
+ if (process.env.SYNC_BATCH_SIZE) {
84
+ config.sync = config.sync || {};
85
+ config.sync.batchSize = parseInt(process.env.SYNC_BATCH_SIZE, 10);
86
+ }
87
+ // Logging
88
+ if (process.env.SYNC_LOG_LEVEL) {
89
+ config.logging = {
90
+ level: process.env.SYNC_LOG_LEVEL,
91
+ };
92
+ }
93
+ return config;
94
+ }
95
+ /**
96
+ * Deep merge configuration objects.
97
+ */
98
+ function mergeConfig(base, ...overrides) {
99
+ const result = { ...base };
100
+ for (const override of overrides) {
101
+ if (override.host !== undefined)
102
+ result.host = override.host;
103
+ if (override.port !== undefined)
104
+ result.port = override.port;
105
+ if (override.basePath !== undefined)
106
+ result.basePath = override.basePath;
107
+ if (override.dataDir !== undefined)
108
+ result.dataDir = override.dataDir;
109
+ if (override.cors) {
110
+ result.cors = { ...result.cors, ...override.cors };
111
+ }
112
+ if (override.auth) {
113
+ result.auth = { ...result.auth, ...override.auth };
114
+ }
115
+ if (override.sync) {
116
+ result.sync = { ...result.sync, ...override.sync };
117
+ }
118
+ if (override.logging) {
119
+ result.logging = { ...result.logging, ...override.logging };
120
+ }
121
+ }
122
+ return result;
123
+ }
124
+ /**
125
+ * Load full configuration from all sources.
126
+ */
127
+ export function loadConfig(options = {}) {
128
+ const sources = [];
129
+ // Load from file if specified or default exists
130
+ const configPath = options.configPath || 'sync-coordinator.json';
131
+ if (options.configPath || existsSync(configPath)) {
132
+ sources.push(loadConfigFile(configPath));
133
+ }
134
+ // Load from environment
135
+ sources.push(loadEnvConfig());
136
+ // Apply programmatic overrides
137
+ if (options.overrides) {
138
+ sources.push(options.overrides);
139
+ }
140
+ const config = mergeConfig(DEFAULT_CONFIG, ...sources);
141
+ configLog('Final config: %O', config);
142
+ return config;
143
+ }
144
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAGL,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAC;QACjD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6B,CAAC;QAC/D,SAAS,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS,CAAC,oCAAoC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAA6B,EAAE,CAAC;IAE5C,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC7C,CAAC;IAED,OAAO;IACP,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC7C,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;aAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAClE,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM,CAAC;IACzE,CAAC;IAED,OAAO;IACP,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAuD,CAAC;QACjF,MAAM,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,UAAU;IACV,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,GAAG;YACf,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAqD;SACzE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAClB,IAAuB,EACvB,GAAG,SAAqC;IAExC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAE3B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC7D,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC7D,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS;YAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACzE,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS;YAAE,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QAEtE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,CAAC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,UAGvB,EAAE;IACJ,MAAM,OAAO,GAA+B,EAAE,CAAC;IAE/C,gDAAgD;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,uBAAuB,CAAC;IACjE,IAAI,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,wBAAwB;IACxB,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAE9B,+BAA+B;IAC/B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,EAAE,GAAG,OAAO,CAAC,CAAC;IACvD,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Configuration types for sync-coordinator.
3
+ */
4
+ /**
5
+ * CORS configuration.
6
+ */
7
+ export interface CorsConfig {
8
+ /** Allowed origins. true = all, false = none, string/array = specific origins */
9
+ origin: boolean | string | string[];
10
+ /** Whether to allow credentials (cookies, auth headers) */
11
+ credentials: boolean;
12
+ }
13
+ /**
14
+ * Authentication configuration.
15
+ */
16
+ export interface AuthConfig {
17
+ /** Authentication mode */
18
+ mode: 'none' | 'token-whitelist' | 'custom';
19
+ /** Allowed tokens for token-whitelist mode */
20
+ tokens?: string[];
21
+ }
22
+ /**
23
+ * Sync-specific settings (passed to SyncManager).
24
+ */
25
+ export interface SyncSettings {
26
+ /** Tombstone retention period in milliseconds */
27
+ tombstoneTTL: number;
28
+ /** Maximum changes per sync batch */
29
+ batchSize: number;
30
+ }
31
+ /**
32
+ * Logging configuration.
33
+ */
34
+ export interface LoggingConfig {
35
+ /** Log level */
36
+ level: 'debug' | 'info' | 'warn' | 'error';
37
+ /** Debug namespace filter (e.g., 'sync-coordinator:*') */
38
+ namespaces?: string;
39
+ }
40
+ /**
41
+ * Full coordinator configuration.
42
+ */
43
+ export interface CoordinatorConfig {
44
+ /** Host to bind to */
45
+ host: string;
46
+ /** Port to listen on */
47
+ port: number;
48
+ /** Base path for all routes */
49
+ basePath: string;
50
+ /** Directory for LevelDB data */
51
+ dataDir: string;
52
+ cors: CorsConfig;
53
+ auth: AuthConfig;
54
+ sync: SyncSettings;
55
+ logging: LoggingConfig;
56
+ }
57
+ /**
58
+ * Default configuration values.
59
+ */
60
+ export declare const DEFAULT_CONFIG: CoordinatorConfig;
61
+ /**
62
+ * Partial configuration for merging.
63
+ */
64
+ export type PartialCoordinatorConfig = {
65
+ host?: string;
66
+ port?: number;
67
+ basePath?: string;
68
+ dataDir?: string;
69
+ cors?: Partial<CorsConfig>;
70
+ auth?: Partial<AuthConfig>;
71
+ sync?: Partial<SyncSettings>;
72
+ logging?: Partial<LoggingConfig>;
73
+ };
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;IACpC,2DAA2D;IAC3D,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,QAAQ,CAAC;IAC5C,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAEhC,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IAGjB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAGhB,IAAI,EAAE,UAAU,CAAC;IAGjB,IAAI,EAAE,UAAU,CAAC;IAGjB,IAAI,EAAE,YAAY,CAAC;IAGnB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,iBAmB5B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Configuration types for sync-coordinator.
3
+ */
4
+ /**
5
+ * Default configuration values.
6
+ */
7
+ export const DEFAULT_CONFIG = {
8
+ host: '0.0.0.0',
9
+ port: 3000,
10
+ basePath: '/sync',
11
+ dataDir: './.data',
12
+ cors: {
13
+ origin: true,
14
+ credentials: true,
15
+ },
16
+ auth: {
17
+ mode: 'none',
18
+ },
19
+ sync: {
20
+ tombstoneTTL: 30 * 24 * 60 * 60 * 1000, // 30 days
21
+ batchSize: 1000,
22
+ },
23
+ logging: {
24
+ level: 'info',
25
+ },
26
+ };
27
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuEH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,OAAO;IACjB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE;QACJ,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,IAAI;KAClB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;KACb;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU;QAClD,SAAS,EAAE,IAAI;KAChB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,MAAM;KACd;CACF,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * sync-coordinator - Standalone coordinator backend for Quereus Sync.
3
+ *
4
+ * This package provides a production-ready sync server that can be deployed
5
+ * independently or embedded in existing applications.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { createCoordinatorServer, loadConfig } from '@quereus/sync-coordinator';
10
+ *
11
+ * const config = loadConfig({ overrides: { port: 8080 } });
12
+ * const server = await createCoordinatorServer({ config });
13
+ * await server.start();
14
+ * ```
15
+ */
16
+ export { type CoordinatorConfig, type PartialCoordinatorConfig, type CorsConfig, type AuthConfig, type SyncSettings, type LoggingConfig, DEFAULT_CONFIG, loadConfig, loadConfigFile, loadEnvConfig, } from './config/index.js';
17
+ export { type ClientIdentity, type ClientSession, type AuthContext, type SyncOperation, type RejectedChange, type ValidationResult, type CoordinatorHooks, CoordinatorService, type CoordinatorServiceOptions, } from './service/index.js';
18
+ export { createCoordinatorServer, type CoordinatorServer, type CoordinatorServerOptions, registerRoutes, registerWebSocket, } from './server/index.js';
19
+ export { type CoordinatorMetrics, type CounterMetric, type GaugeMetric, type HistogramMetric, MetricsRegistry, globalRegistry, createCoordinatorMetrics, } from './metrics/index.js';
20
+ export { createLogger } from './common/index.js';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,cAAc,EACd,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,KAAK,yBAAyB,GAC/B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,eAAe,EACf,cAAc,EACd,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * sync-coordinator - Standalone coordinator backend for Quereus Sync.
3
+ *
4
+ * This package provides a production-ready sync server that can be deployed
5
+ * independently or embedded in existing applications.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { createCoordinatorServer, loadConfig } from '@quereus/sync-coordinator';
10
+ *
11
+ * const config = loadConfig({ overrides: { port: 8080 } });
12
+ * const server = await createCoordinatorServer({ config });
13
+ * await server.start();
14
+ * ```
15
+ */
16
+ // Configuration
17
+ export { DEFAULT_CONFIG, loadConfig, loadConfigFile, loadEnvConfig, } from './config/index.js';
18
+ // Service layer
19
+ export { CoordinatorService, } from './service/index.js';
20
+ // Server
21
+ export { createCoordinatorServer, registerRoutes, registerWebSocket, } from './server/index.js';
22
+ // Metrics
23
+ export { MetricsRegistry, globalRegistry, createCoordinatorMetrics, } from './metrics/index.js';
24
+ // Common utilities
25
+ export { createLogger } from './common/index.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,gBAAgB;AAChB,OAAO,EAOL,cAAc,EACd,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,gBAAgB;AAChB,OAAO,EAQL,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAE5B,SAAS;AACT,OAAO,EACL,uBAAuB,EAGvB,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,UAAU;AACV,OAAO,EAKL,eAAe,EACf,cAAc,EACd,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Coordinator-specific metrics definitions.
3
+ */
4
+ import { type MetricsRegistry } from './registry.js';
5
+ /**
6
+ * Create coordinator metrics on a registry.
7
+ */
8
+ export declare function createCoordinatorMetrics(registry?: MetricsRegistry): {
9
+ wsConnectionsActive: import("./types.js").GaugeMetric;
10
+ wsConnectionsTotal: import("./types.js").CounterMetric;
11
+ httpRequestsTotal: import("./types.js").CounterMetric;
12
+ httpRequestDuration: import("./types.js").HistogramMetric;
13
+ changesAppliedTotal: import("./types.js").CounterMetric;
14
+ changesReceivedTotal: import("./types.js").CounterMetric;
15
+ changesRejectedTotal: import("./types.js").CounterMetric;
16
+ changesBroadcastTotal: import("./types.js").CounterMetric;
17
+ snapshotRequestsTotal: import("./types.js").CounterMetric;
18
+ snapshotChunksTotal: import("./types.js").CounterMetric;
19
+ applyChangesDuration: import("./types.js").HistogramMetric;
20
+ getChangesDuration: import("./types.js").HistogramMetric;
21
+ changeBatchSize: import("./types.js").HistogramMetric;
22
+ authAttemptsTotal: import("./types.js").CounterMetric;
23
+ authFailuresTotal: import("./types.js").CounterMetric;
24
+ registry: MetricsRegistry;
25
+ };
26
+ export type CoordinatorMetrics = ReturnType<typeof createCoordinatorMetrics>;
27
+ //# sourceMappingURL=coordinator-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator-metrics.d.ts","sourceRoot":"","sources":["../../../src/metrics/coordinator-metrics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,GAAE,eAAgC;;;;;;;;;;;;;;;;;EAkHlF;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}