@optimizely/ocp-local-env 1.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -0
- package/dist/package.json +104 -0
- package/dist/public/bundle.da978bb5437cd82e6d37.js +3 -0
- package/dist/public/bundle.da978bb5437cd82e6d37.js.LICENSE.txt +49 -0
- package/dist/public/bundle.da978bb5437cd82e6d37.js.map +1 -0
- package/dist/public/index.html +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +88 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/executor/FunctionExecutor.d.ts +56 -0
- package/dist/src/executor/FunctionExecutor.js +175 -0
- package/dist/src/executor/FunctionExecutor.js.map +1 -0
- package/dist/src/executor/JobExecutor.d.ts +60 -0
- package/dist/src/executor/JobExecutor.js +203 -0
- package/dist/src/executor/JobExecutor.js.map +1 -0
- package/dist/src/executor/LifecycleExecutor.d.ts +45 -0
- package/dist/src/executor/LifecycleExecutor.js +153 -0
- package/dist/src/executor/LifecycleExecutor.js.map +1 -0
- package/dist/src/executor/watcher.d.ts +63 -0
- package/dist/src/executor/watcher.js +213 -0
- package/dist/src/executor/watcher.js.map +1 -0
- package/dist/src/functions/hello.d.ts +4 -0
- package/dist/src/functions/hello.js +8 -0
- package/dist/src/functions/hello.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/jobs/dailyJob.d.ts +4 -0
- package/dist/src/jobs/dailyJob.js +8 -0
- package/dist/src/jobs/dailyJob.js.map +1 -0
- package/dist/src/local_engine/LocalNotifier.d.ts +10 -0
- package/dist/src/local_engine/LocalNotifier.js +26 -0
- package/dist/src/local_engine/LocalNotifier.js.map +1 -0
- package/dist/src/local_engine/local-engine-child-base.d.ts +79 -0
- package/dist/src/local_engine/local-engine-child-base.js +304 -0
- package/dist/src/local_engine/local-engine-child-base.js.map +1 -0
- package/dist/src/local_engine/local-engine-client.d.ts +80 -0
- package/dist/src/local_engine/local-engine-client.js +333 -0
- package/dist/src/local_engine/local-engine-client.js.map +1 -0
- package/dist/src/local_engine/local-engine-types.d.ts +132 -0
- package/dist/src/local_engine/local-engine-types.js +6 -0
- package/dist/src/local_engine/local-engine-types.js.map +1 -0
- package/dist/src/local_engine/local-engine-unified.d.ts +40 -0
- package/dist/src/local_engine/local-engine-unified.js +406 -0
- package/dist/src/local_engine/local-engine-unified.js.map +1 -0
- package/dist/src/local_engine/local-engine-utils.d.ts +70 -0
- package/dist/src/local_engine/local-engine-utils.js +192 -0
- package/dist/src/local_engine/local-engine-utils.js.map +1 -0
- package/dist/src/local_engine/localSDKConfig.d.ts +30 -0
- package/dist/src/local_engine/localSDKConfig.js +392 -0
- package/dist/src/local_engine/localSDKConfig.js.map +1 -0
- package/dist/src/local_engine/storage/LocalConfigStore.d.ts +56 -0
- package/dist/src/local_engine/storage/LocalConfigStore.js +129 -0
- package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalJobStore.d.ts +110 -0
- package/dist/src/local_engine/storage/LocalJobStore.js +239 -0
- package/dist/src/local_engine/storage/LocalJobStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalKVStore.d.ts +105 -0
- package/dist/src/local_engine/storage/LocalKVStore.js +1002 -0
- package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.d.ts +27 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.js +125 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.d.ts +114 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.js +319 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +161 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.js +417 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -0
- package/dist/src/local_engine/storage/NumberSet.d.ts +21 -0
- package/dist/src/local_engine/storage/NumberSet.js +32 -0
- package/dist/src/local_engine/storage/NumberSet.js.map +1 -0
- package/dist/src/local_engine/storage/StringSet.d.ts +21 -0
- package/dist/src/local_engine/storage/StringSet.js +32 -0
- package/dist/src/local_engine/storage/StringSet.js.map +1 -0
- package/dist/src/local_engine/types.d.ts +52 -0
- package/dist/src/local_engine/types.js +6 -0
- package/dist/src/local_engine/types.js.map +1 -0
- package/dist/src/local_engine/utils.d.ts +31 -0
- package/dist/src/local_engine/utils.js +126 -0
- package/dist/src/local_engine/utils.js.map +1 -0
- package/dist/src/logging/LogManager.d.ts +89 -0
- package/dist/src/logging/LogManager.js +237 -0
- package/dist/src/logging/LogManager.js.map +1 -0
- package/dist/src/server/api/functions.d.ts +7 -0
- package/dist/src/server/api/functions.js +80 -0
- package/dist/src/server/api/functions.js.map +1 -0
- package/dist/src/server/api/jobs.d.ts +8 -0
- package/dist/src/server/api/jobs.js +242 -0
- package/dist/src/server/api/jobs.js.map +1 -0
- package/dist/src/server/api/lifecycle.d.ts +6 -0
- package/dist/src/server/api/lifecycle.js +73 -0
- package/dist/src/server/api/lifecycle.js.map +1 -0
- package/dist/src/server/api/settings.d.ts +6 -0
- package/dist/src/server/api/settings.js +117 -0
- package/dist/src/server/api/settings.js.map +1 -0
- package/dist/src/server/api/stores.d.ts +2 -0
- package/dist/src/server/api/stores.js +341 -0
- package/dist/src/server/api/stores.js.map +1 -0
- package/dist/src/server/api/v1.d.ts +10 -0
- package/dist/src/server/api/v1.js +711 -0
- package/dist/src/server/api/v1.js.map +1 -0
- package/dist/src/server/api.d.ts +8 -0
- package/dist/src/server/api.js +154 -0
- package/dist/src/server/api.js.map +1 -0
- package/dist/src/server/app-discovery.d.ts +5 -0
- package/dist/src/server/app-discovery.js +81 -0
- package/dist/src/server/app-discovery.js.map +1 -0
- package/dist/src/server/config.d.ts +21 -0
- package/dist/src/server/config.js +100 -0
- package/dist/src/server/config.js.map +1 -0
- package/dist/src/server/websocket.d.ts +0 -0
- package/dist/src/server/websocket.js +2 -0
- package/dist/src/server/websocket.js.map +1 -0
- package/dist/src/server.d.ts +2 -0
- package/dist/src/server.js +546 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/types/app.d.ts +155 -0
- package/dist/src/types/app.js +24 -0
- package/dist/src/types/app.js.map +1 -0
- package/dist/src/types/kvstore.d.ts +320 -0
- package/dist/src/types/kvstore.js +5 -0
- package/dist/src/types/kvstore.js.map +1 -0
- package/dist/src/ui/components/App.d.ts +6 -0
- package/dist/src/ui/components/App.js +255 -0
- package/dist/src/ui/components/App.js.map +1 -0
- package/dist/src/ui/components/FunctionsView.d.ts +6 -0
- package/dist/src/ui/components/FunctionsView.js +217 -0
- package/dist/src/ui/components/FunctionsView.js.map +1 -0
- package/dist/src/ui/components/JobsView.d.ts +6 -0
- package/dist/src/ui/components/JobsView.js +257 -0
- package/dist/src/ui/components/JobsView.js.map +1 -0
- package/dist/src/ui/components/KVStoreViewer.d.ts +11 -0
- package/dist/src/ui/components/KVStoreViewer.js +168 -0
- package/dist/src/ui/components/KVStoreViewer.js.map +1 -0
- package/dist/src/ui/components/NotificationViewer.d.ts +16 -0
- package/dist/src/ui/components/NotificationViewer.js +69 -0
- package/dist/src/ui/components/NotificationViewer.js.map +1 -0
- package/dist/src/ui/components/SecretsStoreViewer.d.ts +11 -0
- package/dist/src/ui/components/SecretsStoreViewer.js +179 -0
- package/dist/src/ui/components/SecretsStoreViewer.js.map +1 -0
- package/dist/src/ui/components/SettingsStoreViewer.d.ts +24 -0
- package/dist/src/ui/components/SettingsStoreViewer.js +132 -0
- package/dist/src/ui/components/SettingsStoreViewer.js.map +1 -0
- package/dist/src/ui/components/StoreViewer.d.ts +16 -0
- package/dist/src/ui/components/StoreViewer.js +86 -0
- package/dist/src/ui/components/StoreViewer.js.map +1 -0
- package/dist/src/ui/components/TabbedConsole.d.ts +15 -0
- package/dist/src/ui/components/TabbedConsole.js +93 -0
- package/dist/src/ui/components/TabbedConsole.js.map +1 -0
- package/dist/src/ui/components/common/DataTree.d.ts +15 -0
- package/dist/src/ui/components/common/DataTree.js +95 -0
- package/dist/src/ui/components/common/DataTree.js.map +1 -0
- package/dist/src/ui/components/common/EyeIcon.d.ts +11 -0
- package/dist/src/ui/components/common/EyeIcon.js +11 -0
- package/dist/src/ui/components/common/EyeIcon.js.map +1 -0
- package/dist/src/ui/index.d.ts +1 -0
- package/dist/src/ui/index.js +20 -0
- package/dist/src/ui/index.js.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration interface for local app state
|
|
3
|
+
*/
|
|
4
|
+
export interface LocalAppConfig {
|
|
5
|
+
isInstalled: boolean;
|
|
6
|
+
functionGuids?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Local configuration store that manages app state in .ocp-local/config.json
|
|
10
|
+
*/
|
|
11
|
+
export declare class LocalConfigStore {
|
|
12
|
+
private configPath;
|
|
13
|
+
private configDirPath;
|
|
14
|
+
private config;
|
|
15
|
+
constructor(appRootDir: string);
|
|
16
|
+
/**
|
|
17
|
+
* Load configuration from disk or create default if not exists
|
|
18
|
+
*/
|
|
19
|
+
private loadConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Save configuration to disk
|
|
22
|
+
*/
|
|
23
|
+
private saveConfigToDisk;
|
|
24
|
+
/**
|
|
25
|
+
* Get the current configuration
|
|
26
|
+
*/
|
|
27
|
+
getConfig(): LocalAppConfig;
|
|
28
|
+
/**
|
|
29
|
+
* Get the installation status
|
|
30
|
+
*/
|
|
31
|
+
isInstalled(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Set the installation status
|
|
34
|
+
*/
|
|
35
|
+
setInstalled(isInstalled: boolean): void;
|
|
36
|
+
/**
|
|
37
|
+
* Update the entire configuration
|
|
38
|
+
*/
|
|
39
|
+
updateConfig(newConfig: Partial<LocalAppConfig>): void;
|
|
40
|
+
/**
|
|
41
|
+
* Reset configuration to defaults
|
|
42
|
+
*/
|
|
43
|
+
resetConfig(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Get or generate a GUID for a function
|
|
46
|
+
*/
|
|
47
|
+
getFunctionGuid(functionName: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Get all function GUIDs
|
|
50
|
+
*/
|
|
51
|
+
getAllFunctionGuids(): Record<string, string>;
|
|
52
|
+
/**
|
|
53
|
+
* Clear all function GUIDs (useful on uninstall)
|
|
54
|
+
*/
|
|
55
|
+
clearFunctionGuids(): void;
|
|
56
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LocalConfigStore = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
/**
|
|
11
|
+
* Default configuration values
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_CONFIG = {
|
|
14
|
+
isInstalled: false,
|
|
15
|
+
functionGuids: {}
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Local configuration store that manages app state in .ocp-local/config.json
|
|
19
|
+
*/
|
|
20
|
+
class LocalConfigStore {
|
|
21
|
+
constructor(appRootDir) {
|
|
22
|
+
this.configDirPath = path_1.default.join(appRootDir, '.ocp-local');
|
|
23
|
+
this.configPath = path_1.default.join(this.configDirPath, 'config.json');
|
|
24
|
+
this.config = this.loadConfig();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load configuration from disk or create default if not exists
|
|
28
|
+
*/
|
|
29
|
+
loadConfig() {
|
|
30
|
+
try {
|
|
31
|
+
// Ensure the .ocp-local directory exists
|
|
32
|
+
if (!fs_1.default.existsSync(this.configDirPath)) {
|
|
33
|
+
fs_1.default.mkdirSync(this.configDirPath, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
// Load existing config if file exists
|
|
36
|
+
if (fs_1.default.existsSync(this.configPath)) {
|
|
37
|
+
const configData = fs_1.default.readFileSync(this.configPath, 'utf-8');
|
|
38
|
+
const parsedConfig = JSON.parse(configData);
|
|
39
|
+
// Merge with defaults to ensure all required properties exist
|
|
40
|
+
return { ...DEFAULT_CONFIG, ...parsedConfig };
|
|
41
|
+
}
|
|
42
|
+
// Create default config file
|
|
43
|
+
this.saveConfigToDisk(DEFAULT_CONFIG);
|
|
44
|
+
return { ...DEFAULT_CONFIG };
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.warn(`Failed to load config from ${this.configPath}, using defaults:`, error);
|
|
48
|
+
return { ...DEFAULT_CONFIG };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Save configuration to disk
|
|
53
|
+
*/
|
|
54
|
+
saveConfigToDisk(config) {
|
|
55
|
+
try {
|
|
56
|
+
// Ensure the .ocp-local directory exists
|
|
57
|
+
if (!fs_1.default.existsSync(this.configDirPath)) {
|
|
58
|
+
fs_1.default.mkdirSync(this.configDirPath, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
// Write config to file
|
|
61
|
+
fs_1.default.writeFileSync(this.configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error(`Failed to save config to ${this.configPath}:`, error);
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the current configuration
|
|
70
|
+
*/
|
|
71
|
+
getConfig() {
|
|
72
|
+
return { ...this.config };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get the installation status
|
|
76
|
+
*/
|
|
77
|
+
isInstalled() {
|
|
78
|
+
return this.config.isInstalled;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set the installation status
|
|
82
|
+
*/
|
|
83
|
+
setInstalled(isInstalled) {
|
|
84
|
+
this.config.isInstalled = isInstalled;
|
|
85
|
+
this.saveConfigToDisk(this.config);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Update the entire configuration
|
|
89
|
+
*/
|
|
90
|
+
updateConfig(newConfig) {
|
|
91
|
+
this.config = { ...this.config, ...newConfig };
|
|
92
|
+
this.saveConfigToDisk(this.config);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Reset configuration to defaults
|
|
96
|
+
*/
|
|
97
|
+
resetConfig() {
|
|
98
|
+
this.config = { ...DEFAULT_CONFIG };
|
|
99
|
+
this.saveConfigToDisk(this.config);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get or generate a GUID for a function
|
|
103
|
+
*/
|
|
104
|
+
getFunctionGuid(functionName) {
|
|
105
|
+
if (!this.config.functionGuids) {
|
|
106
|
+
this.config.functionGuids = {};
|
|
107
|
+
}
|
|
108
|
+
if (!this.config.functionGuids[functionName]) {
|
|
109
|
+
this.config.functionGuids[functionName] = (0, crypto_1.randomUUID)();
|
|
110
|
+
this.saveConfigToDisk(this.config);
|
|
111
|
+
}
|
|
112
|
+
return this.config.functionGuids[functionName];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get all function GUIDs
|
|
116
|
+
*/
|
|
117
|
+
getAllFunctionGuids() {
|
|
118
|
+
return { ...(this.config.functionGuids || {}) };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Clear all function GUIDs (useful on uninstall)
|
|
122
|
+
*/
|
|
123
|
+
clearFunctionGuids() {
|
|
124
|
+
this.config.functionGuids = {};
|
|
125
|
+
this.saveConfigToDisk(this.config);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.LocalConfigStore = LocalConfigStore;
|
|
129
|
+
//# sourceMappingURL=LocalConfigStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalConfigStore.js","sourceRoot":"","sources":["../../../../src/local_engine/storage/LocalConfigStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job execution status enum
|
|
3
|
+
*/
|
|
4
|
+
export declare enum JobExecutionStatus {
|
|
5
|
+
PENDING = "pending",
|
|
6
|
+
RUNNING = "running",
|
|
7
|
+
COMPLETED = "completed",
|
|
8
|
+
FAILED = "failed",
|
|
9
|
+
INTERRUPTED = "interrupted"
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Job execution record
|
|
13
|
+
*/
|
|
14
|
+
export interface JobExecution {
|
|
15
|
+
id: string;
|
|
16
|
+
jobId: string;
|
|
17
|
+
status: JobExecutionStatus;
|
|
18
|
+
startedAt: Date;
|
|
19
|
+
completedAt?: Date;
|
|
20
|
+
parameters: Record<string, any>;
|
|
21
|
+
error?: {
|
|
22
|
+
message: string;
|
|
23
|
+
stack?: string;
|
|
24
|
+
};
|
|
25
|
+
executionTime?: number;
|
|
26
|
+
stateCount: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Job state snapshot
|
|
30
|
+
*/
|
|
31
|
+
export interface JobStateSnapshot {
|
|
32
|
+
id: string;
|
|
33
|
+
executionId: string;
|
|
34
|
+
timestamp: Date;
|
|
35
|
+
state: Record<string, any>;
|
|
36
|
+
complete: boolean;
|
|
37
|
+
stateHash: string;
|
|
38
|
+
phase: 'prepare' | 'perform';
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Local storage for job executions and state history
|
|
42
|
+
*/
|
|
43
|
+
export declare class LocalJobStore {
|
|
44
|
+
private appDir;
|
|
45
|
+
private static instances;
|
|
46
|
+
private jobsDir;
|
|
47
|
+
private executionsDir;
|
|
48
|
+
private statesDir;
|
|
49
|
+
private constructor();
|
|
50
|
+
/**
|
|
51
|
+
* Get singleton instance for the given app directory
|
|
52
|
+
*/
|
|
53
|
+
static getInstance(appDir: string): LocalJobStore;
|
|
54
|
+
/**
|
|
55
|
+
* Ensure required directories exist
|
|
56
|
+
*/
|
|
57
|
+
private ensureDirectories;
|
|
58
|
+
/**
|
|
59
|
+
* Create a new job execution record
|
|
60
|
+
*/
|
|
61
|
+
createExecution(jobId: string, parameters?: Record<string, any>): JobExecution;
|
|
62
|
+
/**
|
|
63
|
+
* Update job execution status
|
|
64
|
+
*/
|
|
65
|
+
updateExecutionStatus(executionId: string, status: JobExecutionStatus, error?: {
|
|
66
|
+
message: string;
|
|
67
|
+
stack?: string;
|
|
68
|
+
}): void;
|
|
69
|
+
/**
|
|
70
|
+
* Save job state snapshot
|
|
71
|
+
*/
|
|
72
|
+
saveState(executionId: string, state: Record<string, any>, complete: boolean, stateHash: string, phase: 'prepare' | 'perform'): JobStateSnapshot;
|
|
73
|
+
/**
|
|
74
|
+
* Get job execution by ID
|
|
75
|
+
*/
|
|
76
|
+
getExecution(executionId: string): JobExecution | null;
|
|
77
|
+
/**
|
|
78
|
+
* Get all executions, optionally filtered by job ID
|
|
79
|
+
*/
|
|
80
|
+
getExecutions(jobId?: string): JobExecution[];
|
|
81
|
+
/**
|
|
82
|
+
* Get state snapshots for an execution
|
|
83
|
+
*/
|
|
84
|
+
getExecutionStates(executionId: string): JobStateSnapshot[];
|
|
85
|
+
/**
|
|
86
|
+
* Get latest state for an execution
|
|
87
|
+
*/
|
|
88
|
+
getLatestState(executionId: string): JobStateSnapshot | null;
|
|
89
|
+
/**
|
|
90
|
+
* Save execution to disk
|
|
91
|
+
*/
|
|
92
|
+
private saveExecution;
|
|
93
|
+
/**
|
|
94
|
+
* Clean up old executions (7 days retention)
|
|
95
|
+
*/
|
|
96
|
+
cleanup(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Delete execution and its states
|
|
99
|
+
*/
|
|
100
|
+
private deleteExecution;
|
|
101
|
+
/**
|
|
102
|
+
* Get summary statistics
|
|
103
|
+
*/
|
|
104
|
+
getStats(): {
|
|
105
|
+
totalExecutions: number;
|
|
106
|
+
runningExecutions: number;
|
|
107
|
+
completedExecutions: number;
|
|
108
|
+
failedExecutions: number;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LocalJobStore = exports.JobExecutionStatus = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
/**
|
|
11
|
+
* Job execution status enum
|
|
12
|
+
*/
|
|
13
|
+
var JobExecutionStatus;
|
|
14
|
+
(function (JobExecutionStatus) {
|
|
15
|
+
JobExecutionStatus["PENDING"] = "pending";
|
|
16
|
+
JobExecutionStatus["RUNNING"] = "running";
|
|
17
|
+
JobExecutionStatus["COMPLETED"] = "completed";
|
|
18
|
+
JobExecutionStatus["FAILED"] = "failed";
|
|
19
|
+
JobExecutionStatus["INTERRUPTED"] = "interrupted";
|
|
20
|
+
})(JobExecutionStatus = exports.JobExecutionStatus || (exports.JobExecutionStatus = {}));
|
|
21
|
+
/**
|
|
22
|
+
* Local storage for job executions and state history
|
|
23
|
+
*/
|
|
24
|
+
class LocalJobStore {
|
|
25
|
+
constructor(appDir) {
|
|
26
|
+
this.appDir = appDir;
|
|
27
|
+
this.jobsDir = path_1.default.join(appDir, '.ocp-local', 'jobs');
|
|
28
|
+
this.executionsDir = path_1.default.join(this.jobsDir, 'executions');
|
|
29
|
+
this.statesDir = path_1.default.join(this.jobsDir, 'states');
|
|
30
|
+
this.ensureDirectories();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get singleton instance for the given app directory
|
|
34
|
+
*/
|
|
35
|
+
static getInstance(appDir) {
|
|
36
|
+
if (!this.instances.has(appDir)) {
|
|
37
|
+
this.instances.set(appDir, new LocalJobStore(appDir));
|
|
38
|
+
}
|
|
39
|
+
return this.instances.get(appDir);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Ensure required directories exist
|
|
43
|
+
*/
|
|
44
|
+
ensureDirectories() {
|
|
45
|
+
[this.jobsDir, this.executionsDir, this.statesDir].forEach(dir => {
|
|
46
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
47
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a new job execution record
|
|
53
|
+
*/
|
|
54
|
+
createExecution(jobId, parameters = {}) {
|
|
55
|
+
const execution = {
|
|
56
|
+
id: (0, crypto_1.randomUUID)(),
|
|
57
|
+
jobId,
|
|
58
|
+
status: JobExecutionStatus.PENDING,
|
|
59
|
+
startedAt: new Date(),
|
|
60
|
+
parameters,
|
|
61
|
+
stateCount: 0
|
|
62
|
+
};
|
|
63
|
+
this.saveExecution(execution);
|
|
64
|
+
return execution;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Update job execution status
|
|
68
|
+
*/
|
|
69
|
+
updateExecutionStatus(executionId, status, error) {
|
|
70
|
+
const execution = this.getExecution(executionId);
|
|
71
|
+
if (!execution) {
|
|
72
|
+
throw new Error(`Execution not found: ${executionId}`);
|
|
73
|
+
}
|
|
74
|
+
execution.status = status;
|
|
75
|
+
if (error) {
|
|
76
|
+
execution.error = error;
|
|
77
|
+
}
|
|
78
|
+
if (status === JobExecutionStatus.COMPLETED || status === JobExecutionStatus.FAILED || status === JobExecutionStatus.INTERRUPTED) {
|
|
79
|
+
execution.completedAt = new Date();
|
|
80
|
+
execution.executionTime = execution.completedAt.getTime() - execution.startedAt.getTime();
|
|
81
|
+
}
|
|
82
|
+
this.saveExecution(execution);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Save job state snapshot
|
|
86
|
+
*/
|
|
87
|
+
saveState(executionId, state, complete, stateHash, phase) {
|
|
88
|
+
const snapshot = {
|
|
89
|
+
id: (0, crypto_1.randomUUID)(),
|
|
90
|
+
executionId,
|
|
91
|
+
timestamp: new Date(),
|
|
92
|
+
state,
|
|
93
|
+
complete,
|
|
94
|
+
stateHash,
|
|
95
|
+
phase
|
|
96
|
+
};
|
|
97
|
+
// Create execution state directory if it doesn't exist
|
|
98
|
+
const executionStatesDir = path_1.default.join(this.statesDir, executionId);
|
|
99
|
+
if (!fs_1.default.existsSync(executionStatesDir)) {
|
|
100
|
+
fs_1.default.mkdirSync(executionStatesDir, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
// Save state snapshot
|
|
103
|
+
const stateFile = path_1.default.join(executionStatesDir, `state-${snapshot.timestamp.getTime()}.json`);
|
|
104
|
+
fs_1.default.writeFileSync(stateFile, JSON.stringify(snapshot, null, 2));
|
|
105
|
+
// Update state count in execution
|
|
106
|
+
const execution = this.getExecution(executionId);
|
|
107
|
+
if (execution) {
|
|
108
|
+
execution.stateCount++;
|
|
109
|
+
this.saveExecution(execution);
|
|
110
|
+
}
|
|
111
|
+
return snapshot;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get job execution by ID
|
|
115
|
+
*/
|
|
116
|
+
getExecution(executionId) {
|
|
117
|
+
const executionFile = path_1.default.join(this.executionsDir, `${executionId}.json`);
|
|
118
|
+
if (!fs_1.default.existsSync(executionFile)) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const data = JSON.parse(fs_1.default.readFileSync(executionFile, 'utf8'));
|
|
123
|
+
// Convert date strings back to Date objects
|
|
124
|
+
data.startedAt = new Date(data.startedAt);
|
|
125
|
+
if (data.completedAt) {
|
|
126
|
+
data.completedAt = new Date(data.completedAt);
|
|
127
|
+
}
|
|
128
|
+
return data;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error(`Error reading execution file ${executionFile}:`, error);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get all executions, optionally filtered by job ID
|
|
137
|
+
*/
|
|
138
|
+
getExecutions(jobId) {
|
|
139
|
+
if (!fs_1.default.existsSync(this.executionsDir)) {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
const executions = [];
|
|
143
|
+
const files = fs_1.default.readdirSync(this.executionsDir);
|
|
144
|
+
for (const file of files) {
|
|
145
|
+
if (file.endsWith('.json')) {
|
|
146
|
+
const executionId = file.replace('.json', '');
|
|
147
|
+
const execution = this.getExecution(executionId);
|
|
148
|
+
if (execution && (!jobId || execution.jobId === jobId)) {
|
|
149
|
+
executions.push(execution);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Sort by start time (newest first)
|
|
154
|
+
return executions.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get state snapshots for an execution
|
|
158
|
+
*/
|
|
159
|
+
getExecutionStates(executionId) {
|
|
160
|
+
const executionStatesDir = path_1.default.join(this.statesDir, executionId);
|
|
161
|
+
if (!fs_1.default.existsSync(executionStatesDir)) {
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
const states = [];
|
|
165
|
+
const files = fs_1.default.readdirSync(executionStatesDir);
|
|
166
|
+
for (const file of files) {
|
|
167
|
+
if (file.endsWith('.json')) {
|
|
168
|
+
try {
|
|
169
|
+
const stateFile = path_1.default.join(executionStatesDir, file);
|
|
170
|
+
const data = JSON.parse(fs_1.default.readFileSync(stateFile, 'utf8'));
|
|
171
|
+
data.timestamp = new Date(data.timestamp);
|
|
172
|
+
states.push(data);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error(`Error reading state file ${file}:`, error);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Sort by timestamp (oldest first)
|
|
180
|
+
return states.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get latest state for an execution
|
|
184
|
+
*/
|
|
185
|
+
getLatestState(executionId) {
|
|
186
|
+
const states = this.getExecutionStates(executionId);
|
|
187
|
+
return states.length > 0 ? states[states.length - 1] : null;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Save execution to disk
|
|
191
|
+
*/
|
|
192
|
+
saveExecution(execution) {
|
|
193
|
+
const executionFile = path_1.default.join(this.executionsDir, `${execution.id}.json`);
|
|
194
|
+
fs_1.default.writeFileSync(executionFile, JSON.stringify(execution, null, 2));
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Clean up old executions (7 days retention)
|
|
198
|
+
*/
|
|
199
|
+
cleanup() {
|
|
200
|
+
const retentionMs = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
201
|
+
const cutoff = new Date(Date.now() - retentionMs);
|
|
202
|
+
const executions = this.getExecutions();
|
|
203
|
+
for (const execution of executions) {
|
|
204
|
+
if (execution.startedAt < cutoff) {
|
|
205
|
+
this.deleteExecution(execution.id);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Delete execution and its states
|
|
211
|
+
*/
|
|
212
|
+
deleteExecution(executionId) {
|
|
213
|
+
// Delete execution file
|
|
214
|
+
const executionFile = path_1.default.join(this.executionsDir, `${executionId}.json`);
|
|
215
|
+
if (fs_1.default.existsSync(executionFile)) {
|
|
216
|
+
fs_1.default.unlinkSync(executionFile);
|
|
217
|
+
}
|
|
218
|
+
// Delete state directory
|
|
219
|
+
const executionStatesDir = path_1.default.join(this.statesDir, executionId);
|
|
220
|
+
if (fs_1.default.existsSync(executionStatesDir)) {
|
|
221
|
+
fs_1.default.rmSync(executionStatesDir, { recursive: true, force: true });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get summary statistics
|
|
226
|
+
*/
|
|
227
|
+
getStats() {
|
|
228
|
+
const executions = this.getExecutions();
|
|
229
|
+
return {
|
|
230
|
+
totalExecutions: executions.length,
|
|
231
|
+
runningExecutions: executions.filter(e => e.status === JobExecutionStatus.RUNNING).length,
|
|
232
|
+
completedExecutions: executions.filter(e => e.status === JobExecutionStatus.COMPLETED).length,
|
|
233
|
+
failedExecutions: executions.filter(e => e.status === JobExecutionStatus.FAILED).length
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.LocalJobStore = LocalJobStore;
|
|
238
|
+
LocalJobStore.instances = new Map();
|
|
239
|
+
//# sourceMappingURL=LocalJobStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalJobStore.js","sourceRoot":"","sources":["../../../../src/local_engine/storage/LocalJobStore.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,mCAAoC;AAEpC;;GAEG;AACH,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC5B,yCAAmB,CAAA;IACnB,yCAAmB,CAAA;IACnB,6CAAuB,CAAA;IACvB,uCAAiB,CAAA;IACjB,iDAA2B,CAAA;AAC7B,CAAC,EANW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAM7B;AAiCD;;GAEG;AACH,MAAa,aAAa;IAMxB,YAA4B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QACxC,IAAI,CAAC,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEnD,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAW,CAAC,MAAc;QACtC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;SACvD;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC/D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACvB,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;aACxC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,KAAa,EAAE,aAAkC,EAAE;QACxE,MAAM,SAAS,GAAiB;YAC9B,EAAE,EAAE,IAAA,mBAAU,GAAE;YAChB,KAAK;YACL,MAAM,EAAE,kBAAkB,CAAC,OAAO;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,UAAU;YACV,UAAU,EAAE,CAAC;SACd,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,qBAAqB,CAC1B,WAAmB,EACnB,MAA0B,EAC1B,KAA2C;QAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;SACxD;QAED,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QAC1B,IAAI,KAAK,EAAE;YACT,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;SACzB;QAED,IAAI,MAAM,KAAK,kBAAkB,CAAC,SAAS,IAAI,MAAM,KAAK,kBAAkB,CAAC,MAAM,IAAI,MAAM,KAAK,kBAAkB,CAAC,WAAW,EAAE;YAChI,SAAS,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YACnC,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;SAC3F;QAED,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,WAAmB,EAAE,KAA0B,EAAE,QAAiB,EAAE,SAAiB,EAAE,KAA4B;QAClI,MAAM,QAAQ,GAAqB;YACjC,EAAE,EAAE,IAAA,mBAAU,GAAE;YAChB,WAAW;YACX,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,KAAK;YACL,QAAQ;YACR,SAAS;YACT,KAAK;SACN,CAAC;QAEF,uDAAuD;QACvD,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;YACtC,YAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;SACvD;QAED,sBAAsB;QACtB,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9F,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/D,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE;YACb,SAAS,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;SAC/B;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,WAAmB;QACrC,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;QAE3E,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;YAChE,4CAA4C;YAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAC/C;YACD,OAAO,IAAI,CAAC;SACb;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,gCAAgC,aAAa,GAAG,EAAE,KAAK,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,KAAc;QACjC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YACtC,OAAO,EAAE,CAAC;SACX;QAED,MAAM,UAAU,GAAmB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;gBAEjD,IAAI,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE;oBACtD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBAC5B;aACF;SACF;QAED,oCAAoC;QACpC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,WAAmB;QAC3C,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAElE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;YACtC,OAAO,EAAE,CAAC;SACX;QAED,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAEjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAC1B,IAAI;oBACF,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;oBACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACnB;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;iBAC3D;aACF;SACF;QAED,mCAAmC;QACnC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,WAAmB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,SAAuB;QAC3C,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5E,YAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;QACtD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,CAAC;QAElD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,IAAI,SAAS,CAAC,SAAS,GAAG,MAAM,EAAE;gBAChC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;aACpC;SACF;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,WAAmB;QACzC,wBAAwB;QACxB,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;QAC3E,IAAI,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;YAChC,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;SAC9B;QAED,yBAAyB;QACzB,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,YAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;YACrC,YAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;SACjE;IACH,CAAC;IAED;;OAEG;IACI,QAAQ;QAMb,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAExC,OAAO;YACL,eAAe,EAAE,UAAU,CAAC,MAAM;YAClC,iBAAiB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM;YACzF,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,SAAS,CAAC,CAAC,MAAM;YAC7F,gBAAgB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC,MAAM;SACxF,CAAC;IACJ,CAAC;;AAjQH,sCAkQC;AAjQgB,uBAAS,GAAG,IAAI,GAAG,EAAyB,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { KVStore, KVHash, KVRowOptions, KVPatchUpdater, MultiValue, Value } from '../../types/kvstore';
|
|
2
|
+
import { NumberSet } from './NumberSet';
|
|
3
|
+
import { StringSet } from './StringSet';
|
|
4
|
+
/**
|
|
5
|
+
* Local implementation of KVStore that persists data to disk
|
|
6
|
+
* Follows the pattern of LocalSettingsStore with singleton per app directory
|
|
7
|
+
*/
|
|
8
|
+
export declare class LocalKVStore implements KVStore {
|
|
9
|
+
private static instances;
|
|
10
|
+
private kvStorePath;
|
|
11
|
+
private configDirPath;
|
|
12
|
+
private appRootDir;
|
|
13
|
+
private storeFileName;
|
|
14
|
+
private constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Get or create a singleton instance for the given app directory
|
|
17
|
+
*/
|
|
18
|
+
static getInstance(appRootDir: string, storeFileName?: string): LocalKVStore;
|
|
19
|
+
/**
|
|
20
|
+
* Clear singleton instance for testing
|
|
21
|
+
*/
|
|
22
|
+
static clearInstance(appRootDir: string, storeFileName?: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Clear all singleton instances for testing
|
|
25
|
+
*/
|
|
26
|
+
static clearAllInstances(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Ensure store file exists with empty structure
|
|
29
|
+
*/
|
|
30
|
+
private ensureStoreFileExists;
|
|
31
|
+
/**
|
|
32
|
+
* Load data from disk and clean up expired entries
|
|
33
|
+
*/
|
|
34
|
+
private loadDataFromDisk;
|
|
35
|
+
/**
|
|
36
|
+
* Save data to disk atomically
|
|
37
|
+
*/
|
|
38
|
+
private saveDataToDisk;
|
|
39
|
+
/**
|
|
40
|
+
* Deserialize data with custom handling for NumberSet and StringSet
|
|
41
|
+
*/
|
|
42
|
+
private deserializeValue;
|
|
43
|
+
/**
|
|
44
|
+
* Get stored item with deserialization
|
|
45
|
+
*/
|
|
46
|
+
private getStoredItem;
|
|
47
|
+
/**
|
|
48
|
+
* Store item with optional TTL
|
|
49
|
+
*/
|
|
50
|
+
private storeItem;
|
|
51
|
+
get<T extends KVHash>(key: string, fields?: string[]): Promise<T>;
|
|
52
|
+
put<T extends KVHash>(key: string, value: T, options?: KVRowOptions): Promise<T>;
|
|
53
|
+
patch<T extends KVHash>(key: string, value: T, options?: KVRowOptions): Promise<T>;
|
|
54
|
+
patch<T extends KVHash>(key: string, updater: KVPatchUpdater<T>, options?: KVRowOptions): Promise<T>;
|
|
55
|
+
delete<T extends KVHash>(key: string, fields?: string[]): Promise<T>;
|
|
56
|
+
exists(key: string): Promise<boolean>;
|
|
57
|
+
increment(key: string, field: string, amount?: number, options?: KVRowOptions): Promise<number>;
|
|
58
|
+
incrementMulti(key: string, fieldAmounts: MultiValue<number>, options?: KVRowOptions): Promise<MultiValue<number>>;
|
|
59
|
+
shift<T extends Value>(key: string, field: string): Promise<T | undefined>;
|
|
60
|
+
shiftMulti<T extends Value>(key: string, fieldCounts: MultiValue<number>): Promise<MultiValue<T[]>>;
|
|
61
|
+
unshift<T extends Value>(key: string, field: string, value: T): Promise<void>;
|
|
62
|
+
unshiftMulti<T extends Value>(key: string, fieldValues: MultiValue<T[]>): Promise<void>;
|
|
63
|
+
peek<T extends Value>(key: string, field: string): Promise<T | undefined>;
|
|
64
|
+
peekMulti<T extends Value>(key: string, fieldCounts: MultiValue<number>): Promise<MultiValue<T[]>>;
|
|
65
|
+
append<T extends Value>(key: string, field: string, value: T): Promise<void>;
|
|
66
|
+
appendMulti<T extends Value>(key: string, fieldValues: MultiValue<T[]>): Promise<void>;
|
|
67
|
+
addNumber(key: string, field: string, value: number): Promise<boolean>;
|
|
68
|
+
addNumberMulti(key: string, fieldValues: MultiValue<number[]>): Promise<MultiValue<NumberSet>>;
|
|
69
|
+
removeNumber(key: string, field: string, value: number): Promise<boolean>;
|
|
70
|
+
removeNumberMulti(key: string, fieldValues: MultiValue<number[]>): Promise<MultiValue<NumberSet>>;
|
|
71
|
+
hasNumber(key: string, field: string, value: number): Promise<boolean>;
|
|
72
|
+
hasNumberMulti(key: string, fieldValues: MultiValue<number[]>): Promise<MultiValue<NumberSet>>;
|
|
73
|
+
addString(key: string, field: string, value: string): Promise<boolean>;
|
|
74
|
+
addStringMulti(key: string, fieldValues: MultiValue<string[]>): Promise<MultiValue<StringSet>>;
|
|
75
|
+
removeString(key: string, field: string, value: string): Promise<boolean>;
|
|
76
|
+
removeStringMulti(key: string, fieldValues: MultiValue<string[]>): Promise<MultiValue<StringSet>>;
|
|
77
|
+
hasString(key: string, field: string, value: string): Promise<boolean>;
|
|
78
|
+
hasStringMulti(key: string, fieldValues: MultiValue<string[]>): Promise<MultiValue<StringSet>>;
|
|
79
|
+
/**
|
|
80
|
+
* Get all stored data as a simple key-value object for the UI
|
|
81
|
+
*/
|
|
82
|
+
getAllData(): {
|
|
83
|
+
[key: string]: any;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Set a simple key-value pair (for UI convenience)
|
|
87
|
+
*/
|
|
88
|
+
set(key: string, value: any): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Get a simple value by key (for UI convenience)
|
|
91
|
+
*/
|
|
92
|
+
getValue(key: string): Promise<any>;
|
|
93
|
+
/**
|
|
94
|
+
* Delete a key entirely (for UI convenience)
|
|
95
|
+
*/
|
|
96
|
+
deleteKey(key: string): Promise<boolean>;
|
|
97
|
+
/**
|
|
98
|
+
* Get all keys
|
|
99
|
+
*/
|
|
100
|
+
getAllKeys(): string[];
|
|
101
|
+
/**
|
|
102
|
+
* Get a shared instance for shared KV store (global across installations of the same app)
|
|
103
|
+
*/
|
|
104
|
+
static getSharedInstance(appRootDir: string): LocalKVStore;
|
|
105
|
+
}
|