@objectstack/core 1.0.2 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +58 -0
- package/CHANGELOG.md +25 -0
- package/dist/index.cjs +4294 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1777 -0
- package/dist/index.d.ts +1776 -21
- package/dist/index.js +4246 -23
- package/dist/index.js.map +1 -0
- package/package.json +4 -4
- package/tsconfig.json +1 -3
- package/dist/api-registry-plugin.d.ts +0 -54
- package/dist/api-registry-plugin.d.ts.map +0 -1
- package/dist/api-registry-plugin.js +0 -53
- package/dist/api-registry-plugin.test.d.ts +0 -2
- package/dist/api-registry-plugin.test.d.ts.map +0 -1
- package/dist/api-registry-plugin.test.js +0 -334
- package/dist/api-registry.d.ts +0 -259
- package/dist/api-registry.d.ts.map +0 -1
- package/dist/api-registry.js +0 -600
- package/dist/api-registry.test.d.ts +0 -2
- package/dist/api-registry.test.d.ts.map +0 -1
- package/dist/api-registry.test.js +0 -957
- package/dist/contracts/data-engine.d.ts +0 -62
- package/dist/contracts/data-engine.d.ts.map +0 -1
- package/dist/contracts/data-engine.js +0 -1
- package/dist/contracts/http-server.d.ts +0 -119
- package/dist/contracts/http-server.d.ts.map +0 -1
- package/dist/contracts/http-server.js +0 -11
- package/dist/contracts/logger.d.ts +0 -63
- package/dist/contracts/logger.d.ts.map +0 -1
- package/dist/contracts/logger.js +0 -1
- package/dist/dependency-resolver.d.ts +0 -62
- package/dist/dependency-resolver.d.ts.map +0 -1
- package/dist/dependency-resolver.js +0 -317
- package/dist/dependency-resolver.test.d.ts +0 -2
- package/dist/dependency-resolver.test.d.ts.map +0 -1
- package/dist/dependency-resolver.test.js +0 -241
- package/dist/health-monitor.d.ts +0 -65
- package/dist/health-monitor.d.ts.map +0 -1
- package/dist/health-monitor.js +0 -269
- package/dist/health-monitor.test.d.ts +0 -2
- package/dist/health-monitor.test.d.ts.map +0 -1
- package/dist/health-monitor.test.js +0 -68
- package/dist/hot-reload.d.ts +0 -79
- package/dist/hot-reload.d.ts.map +0 -1
- package/dist/hot-reload.js +0 -313
- package/dist/index.d.ts.map +0 -1
- package/dist/kernel-base.d.ts +0 -84
- package/dist/kernel-base.d.ts.map +0 -1
- package/dist/kernel-base.js +0 -219
- package/dist/kernel.d.ts +0 -113
- package/dist/kernel.d.ts.map +0 -1
- package/dist/kernel.js +0 -472
- package/dist/kernel.test.d.ts +0 -2
- package/dist/kernel.test.d.ts.map +0 -1
- package/dist/kernel.test.js +0 -414
- package/dist/lite-kernel.d.ts +0 -55
- package/dist/lite-kernel.d.ts.map +0 -1
- package/dist/lite-kernel.js +0 -112
- package/dist/lite-kernel.test.d.ts +0 -2
- package/dist/lite-kernel.test.d.ts.map +0 -1
- package/dist/lite-kernel.test.js +0 -161
- package/dist/logger.d.ts +0 -71
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -312
- package/dist/logger.test.d.ts +0 -2
- package/dist/logger.test.d.ts.map +0 -1
- package/dist/logger.test.js +0 -92
- package/dist/plugin-loader.d.ts +0 -164
- package/dist/plugin-loader.d.ts.map +0 -1
- package/dist/plugin-loader.js +0 -319
- package/dist/plugin-loader.test.d.ts +0 -2
- package/dist/plugin-loader.test.d.ts.map +0 -1
- package/dist/plugin-loader.test.js +0 -348
- package/dist/qa/adapter.d.ts +0 -14
- package/dist/qa/adapter.d.ts.map +0 -1
- package/dist/qa/adapter.js +0 -1
- package/dist/qa/http-adapter.d.ts +0 -16
- package/dist/qa/http-adapter.d.ts.map +0 -1
- package/dist/qa/http-adapter.js +0 -107
- package/dist/qa/index.d.ts +0 -4
- package/dist/qa/index.d.ts.map +0 -1
- package/dist/qa/index.js +0 -3
- package/dist/qa/runner.d.ts +0 -27
- package/dist/qa/runner.d.ts.map +0 -1
- package/dist/qa/runner.js +0 -157
- package/dist/security/index.d.ts +0 -17
- package/dist/security/index.d.ts.map +0 -1
- package/dist/security/index.js +0 -17
- package/dist/security/permission-manager.d.ts +0 -96
- package/dist/security/permission-manager.d.ts.map +0 -1
- package/dist/security/permission-manager.js +0 -235
- package/dist/security/permission-manager.test.d.ts +0 -2
- package/dist/security/permission-manager.test.d.ts.map +0 -1
- package/dist/security/permission-manager.test.js +0 -220
- package/dist/security/plugin-config-validator.d.ts +0 -79
- package/dist/security/plugin-config-validator.d.ts.map +0 -1
- package/dist/security/plugin-config-validator.js +0 -166
- package/dist/security/plugin-config-validator.test.d.ts +0 -2
- package/dist/security/plugin-config-validator.test.d.ts.map +0 -1
- package/dist/security/plugin-config-validator.test.js +0 -223
- package/dist/security/plugin-permission-enforcer.d.ts +0 -154
- package/dist/security/plugin-permission-enforcer.d.ts.map +0 -1
- package/dist/security/plugin-permission-enforcer.js +0 -323
- package/dist/security/plugin-permission-enforcer.test.d.ts +0 -2
- package/dist/security/plugin-permission-enforcer.test.d.ts.map +0 -1
- package/dist/security/plugin-permission-enforcer.test.js +0 -205
- package/dist/security/plugin-signature-verifier.d.ts +0 -96
- package/dist/security/plugin-signature-verifier.d.ts.map +0 -1
- package/dist/security/plugin-signature-verifier.js +0 -250
- package/dist/security/sandbox-runtime.d.ts +0 -115
- package/dist/security/sandbox-runtime.d.ts.map +0 -1
- package/dist/security/sandbox-runtime.js +0 -311
- package/dist/security/security-scanner.d.ts +0 -92
- package/dist/security/security-scanner.d.ts.map +0 -1
- package/dist/security/security-scanner.js +0 -273
- package/dist/types.d.ts +0 -89
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/utils/env.d.ts +0 -20
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -46
- package/dist/utils/env.test.d.ts +0 -2
- package/dist/utils/env.test.d.ts.map +0 -1
- package/dist/utils/env.test.js +0 -52
package/dist/hot-reload.d.ts
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import type { HotReloadConfig } from '@objectstack/spec/kernel';
|
|
2
|
-
import type { ObjectLogger } from './logger.js';
|
|
3
|
-
import type { Plugin } from './types.js';
|
|
4
|
-
/**
|
|
5
|
-
* Plugin State Manager
|
|
6
|
-
*
|
|
7
|
-
* Handles state persistence and restoration during hot reloads
|
|
8
|
-
*/
|
|
9
|
-
declare class PluginStateManager {
|
|
10
|
-
private logger;
|
|
11
|
-
private stateSnapshots;
|
|
12
|
-
private memoryStore;
|
|
13
|
-
constructor(logger: ObjectLogger);
|
|
14
|
-
/**
|
|
15
|
-
* Save plugin state before reload
|
|
16
|
-
*/
|
|
17
|
-
saveState(pluginId: string, version: string, state: Record<string, any>, config: HotReloadConfig): Promise<string>;
|
|
18
|
-
/**
|
|
19
|
-
* Restore plugin state after reload
|
|
20
|
-
*/
|
|
21
|
-
restoreState(pluginId: string, snapshotId?: string): Promise<Record<string, any> | undefined>;
|
|
22
|
-
/**
|
|
23
|
-
* Clear state for a plugin
|
|
24
|
-
*/
|
|
25
|
-
clearState(pluginId: string): void;
|
|
26
|
-
/**
|
|
27
|
-
* Calculate simple checksum for state verification
|
|
28
|
-
* WARNING: This is a simple hash for demo purposes.
|
|
29
|
-
* In production, use a cryptographic hash like SHA-256.
|
|
30
|
-
*/
|
|
31
|
-
private calculateChecksum;
|
|
32
|
-
/**
|
|
33
|
-
* Shutdown state manager
|
|
34
|
-
*/
|
|
35
|
-
shutdown(): void;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Hot Reload Manager
|
|
39
|
-
*
|
|
40
|
-
* Manages hot reloading of plugins with state preservation
|
|
41
|
-
*/
|
|
42
|
-
export declare class HotReloadManager {
|
|
43
|
-
private logger;
|
|
44
|
-
private stateManager;
|
|
45
|
-
private reloadConfigs;
|
|
46
|
-
private watchHandles;
|
|
47
|
-
private reloadTimers;
|
|
48
|
-
constructor(logger: ObjectLogger);
|
|
49
|
-
/**
|
|
50
|
-
* Register a plugin for hot reload
|
|
51
|
-
*/
|
|
52
|
-
registerPlugin(pluginName: string, config: HotReloadConfig): void;
|
|
53
|
-
/**
|
|
54
|
-
* Start watching for changes (requires file system integration)
|
|
55
|
-
*/
|
|
56
|
-
startWatching(pluginName: string): void;
|
|
57
|
-
/**
|
|
58
|
-
* Stop watching for changes
|
|
59
|
-
*/
|
|
60
|
-
stopWatching(pluginName: string): void;
|
|
61
|
-
/**
|
|
62
|
-
* Trigger hot reload for a plugin
|
|
63
|
-
*/
|
|
64
|
-
reloadPlugin(pluginName: string, plugin: Plugin, version: string, getPluginState: () => Record<string, any>, restorePluginState: (state: Record<string, any>) => void): Promise<boolean>;
|
|
65
|
-
/**
|
|
66
|
-
* Schedule a reload with debouncing
|
|
67
|
-
*/
|
|
68
|
-
scheduleReload(pluginName: string, reloadFn: () => Promise<void>): void;
|
|
69
|
-
/**
|
|
70
|
-
* Get state manager for direct access
|
|
71
|
-
*/
|
|
72
|
-
getStateManager(): PluginStateManager;
|
|
73
|
-
/**
|
|
74
|
-
* Shutdown hot reload manager
|
|
75
|
-
*/
|
|
76
|
-
shutdown(): void;
|
|
77
|
-
}
|
|
78
|
-
export {};
|
|
79
|
-
//# sourceMappingURL=hot-reload.d.ts.map
|
package/dist/hot-reload.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hot-reload.d.ts","sourceRoot":"","sources":["../src/hot-reload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAezC;;;;GAIG;AACH,cAAM,kBAAkB;IACtB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,WAAW,CAA0B;gBAEjC,MAAM,EAAE,YAAY;IAIhC;;OAEG;IACG,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC;IA8ClB;;OAEG;IACG,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IAgC3C;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMlC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,QAAQ,IAAI,IAAI;CAKjB;AAED;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,YAAY,CAAqC;gBAE7C,MAAM,EAAE,YAAY;IAKhC;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAcjE;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAcvC;;OAEG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAgBtC;;OAEG;IACG,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,GACvD,OAAO,CAAC,OAAO,CAAC;IA8EnB;;OAEG;IACH,cAAc,CACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC5B,IAAI;IAiCP;;OAEG;IACH,eAAe,IAAI,kBAAkB;IAIrC;;OAEG;IACH,QAAQ,IAAI,IAAI;CAkBjB"}
|
package/dist/hot-reload.js
DELETED
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
// Polyfill for UUID generation to support both Node.js and Browser
|
|
2
|
-
const generateUUID = () => {
|
|
3
|
-
if (typeof crypto !== 'undefined' && crypto.randomUUID) {
|
|
4
|
-
return crypto.randomUUID();
|
|
5
|
-
}
|
|
6
|
-
// Basic UUID v4 fallback
|
|
7
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
8
|
-
const r = Math.random() * 16 | 0;
|
|
9
|
-
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
10
|
-
return v.toString(16);
|
|
11
|
-
});
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* Plugin State Manager
|
|
15
|
-
*
|
|
16
|
-
* Handles state persistence and restoration during hot reloads
|
|
17
|
-
*/
|
|
18
|
-
class PluginStateManager {
|
|
19
|
-
constructor(logger) {
|
|
20
|
-
this.stateSnapshots = new Map();
|
|
21
|
-
this.memoryStore = new Map();
|
|
22
|
-
this.logger = logger.child({ component: 'StateManager' });
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Save plugin state before reload
|
|
26
|
-
*/
|
|
27
|
-
async saveState(pluginId, version, state, config) {
|
|
28
|
-
const snapshot = {
|
|
29
|
-
pluginId,
|
|
30
|
-
version,
|
|
31
|
-
timestamp: new Date().toISOString(),
|
|
32
|
-
state,
|
|
33
|
-
metadata: {
|
|
34
|
-
checksum: this.calculateChecksum(state),
|
|
35
|
-
compressed: false,
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
const snapshotId = generateUUID();
|
|
39
|
-
switch (config.stateStrategy) {
|
|
40
|
-
case 'memory':
|
|
41
|
-
this.memoryStore.set(snapshotId, snapshot);
|
|
42
|
-
this.logger.debug('State saved to memory', { pluginId, snapshotId });
|
|
43
|
-
break;
|
|
44
|
-
case 'disk':
|
|
45
|
-
// For disk storage, we would write to file system
|
|
46
|
-
// For now, store in memory as fallback
|
|
47
|
-
this.memoryStore.set(snapshotId, snapshot);
|
|
48
|
-
this.logger.debug('State saved to disk (memory fallback)', { pluginId, snapshotId });
|
|
49
|
-
break;
|
|
50
|
-
case 'distributed':
|
|
51
|
-
// For distributed storage, would use Redis/etcd
|
|
52
|
-
// For now, store in memory as fallback
|
|
53
|
-
this.memoryStore.set(snapshotId, snapshot);
|
|
54
|
-
this.logger.debug('State saved to distributed store (memory fallback)', {
|
|
55
|
-
pluginId,
|
|
56
|
-
snapshotId
|
|
57
|
-
});
|
|
58
|
-
break;
|
|
59
|
-
case 'none':
|
|
60
|
-
this.logger.debug('State persistence disabled', { pluginId });
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
this.stateSnapshots.set(pluginId, snapshot);
|
|
64
|
-
return snapshotId;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Restore plugin state after reload
|
|
68
|
-
*/
|
|
69
|
-
async restoreState(pluginId, snapshotId) {
|
|
70
|
-
// Try to get from snapshot ID first, otherwise use latest for plugin
|
|
71
|
-
let snapshot;
|
|
72
|
-
if (snapshotId) {
|
|
73
|
-
snapshot = this.memoryStore.get(snapshotId);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
snapshot = this.stateSnapshots.get(pluginId);
|
|
77
|
-
}
|
|
78
|
-
if (!snapshot) {
|
|
79
|
-
this.logger.warn('No state snapshot found', { pluginId, snapshotId });
|
|
80
|
-
return undefined;
|
|
81
|
-
}
|
|
82
|
-
// Verify checksum if available
|
|
83
|
-
if (snapshot.metadata?.checksum) {
|
|
84
|
-
const currentChecksum = this.calculateChecksum(snapshot.state);
|
|
85
|
-
if (currentChecksum !== snapshot.metadata.checksum) {
|
|
86
|
-
this.logger.error('State checksum mismatch - data may be corrupted', {
|
|
87
|
-
pluginId,
|
|
88
|
-
expected: snapshot.metadata.checksum,
|
|
89
|
-
actual: currentChecksum
|
|
90
|
-
});
|
|
91
|
-
return undefined;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
this.logger.debug('State restored', { pluginId, version: snapshot.version });
|
|
95
|
-
return snapshot.state;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Clear state for a plugin
|
|
99
|
-
*/
|
|
100
|
-
clearState(pluginId) {
|
|
101
|
-
this.stateSnapshots.delete(pluginId);
|
|
102
|
-
// Note: We don't clear memory store as it might have multiple snapshots
|
|
103
|
-
this.logger.debug('State cleared', { pluginId });
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Calculate simple checksum for state verification
|
|
107
|
-
* WARNING: This is a simple hash for demo purposes.
|
|
108
|
-
* In production, use a cryptographic hash like SHA-256.
|
|
109
|
-
*/
|
|
110
|
-
calculateChecksum(state) {
|
|
111
|
-
// Simple checksum using JSON serialization
|
|
112
|
-
// TODO: Replace with crypto.createHash('sha256') for production
|
|
113
|
-
const stateStr = JSON.stringify(state);
|
|
114
|
-
let hash = 0;
|
|
115
|
-
for (let i = 0; i < stateStr.length; i++) {
|
|
116
|
-
const char = stateStr.charCodeAt(i);
|
|
117
|
-
hash = ((hash << 5) - hash) + char;
|
|
118
|
-
hash = hash & hash; // Convert to 32-bit integer
|
|
119
|
-
}
|
|
120
|
-
return hash.toString(16);
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Shutdown state manager
|
|
124
|
-
*/
|
|
125
|
-
shutdown() {
|
|
126
|
-
this.stateSnapshots.clear();
|
|
127
|
-
this.memoryStore.clear();
|
|
128
|
-
this.logger.info('State manager shutdown complete');
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Hot Reload Manager
|
|
133
|
-
*
|
|
134
|
-
* Manages hot reloading of plugins with state preservation
|
|
135
|
-
*/
|
|
136
|
-
export class HotReloadManager {
|
|
137
|
-
constructor(logger) {
|
|
138
|
-
this.reloadConfigs = new Map();
|
|
139
|
-
this.watchHandles = new Map();
|
|
140
|
-
this.reloadTimers = new Map();
|
|
141
|
-
this.logger = logger.child({ component: 'HotReload' });
|
|
142
|
-
this.stateManager = new PluginStateManager(logger);
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Register a plugin for hot reload
|
|
146
|
-
*/
|
|
147
|
-
registerPlugin(pluginName, config) {
|
|
148
|
-
if (!config.enabled) {
|
|
149
|
-
this.logger.debug('Hot reload disabled for plugin', { plugin: pluginName });
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
this.reloadConfigs.set(pluginName, config);
|
|
153
|
-
this.logger.info('Plugin registered for hot reload', {
|
|
154
|
-
plugin: pluginName,
|
|
155
|
-
watchPatterns: config.watchPatterns,
|
|
156
|
-
stateStrategy: config.stateStrategy
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Start watching for changes (requires file system integration)
|
|
161
|
-
*/
|
|
162
|
-
startWatching(pluginName) {
|
|
163
|
-
const config = this.reloadConfigs.get(pluginName);
|
|
164
|
-
if (!config || !config.enabled) {
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
// Note: Actual file watching would require chokidar or similar
|
|
168
|
-
// This is a placeholder for the integration point
|
|
169
|
-
this.logger.info('File watching started', {
|
|
170
|
-
plugin: pluginName,
|
|
171
|
-
patterns: config.watchPatterns
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Stop watching for changes
|
|
176
|
-
*/
|
|
177
|
-
stopWatching(pluginName) {
|
|
178
|
-
const handle = this.watchHandles.get(pluginName);
|
|
179
|
-
if (handle) {
|
|
180
|
-
// Stop watching (would call chokidar close())
|
|
181
|
-
this.watchHandles.delete(pluginName);
|
|
182
|
-
this.logger.info('File watching stopped', { plugin: pluginName });
|
|
183
|
-
}
|
|
184
|
-
// Clear any pending reload timers
|
|
185
|
-
const timer = this.reloadTimers.get(pluginName);
|
|
186
|
-
if (timer) {
|
|
187
|
-
clearTimeout(timer);
|
|
188
|
-
this.reloadTimers.delete(pluginName);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Trigger hot reload for a plugin
|
|
193
|
-
*/
|
|
194
|
-
async reloadPlugin(pluginName, plugin, version, getPluginState, restorePluginState) {
|
|
195
|
-
const config = this.reloadConfigs.get(pluginName);
|
|
196
|
-
if (!config) {
|
|
197
|
-
this.logger.warn('Cannot reload - plugin not registered', { plugin: pluginName });
|
|
198
|
-
return false;
|
|
199
|
-
}
|
|
200
|
-
this.logger.info('Starting hot reload', { plugin: pluginName });
|
|
201
|
-
try {
|
|
202
|
-
// Call before reload hooks
|
|
203
|
-
if (config.beforeReload) {
|
|
204
|
-
this.logger.debug('Executing before reload hooks', {
|
|
205
|
-
plugin: pluginName,
|
|
206
|
-
hooks: config.beforeReload
|
|
207
|
-
});
|
|
208
|
-
// Hook execution would be done through kernel's hook system
|
|
209
|
-
}
|
|
210
|
-
// Save state if configured
|
|
211
|
-
let snapshotId;
|
|
212
|
-
if (config.preserveState && config.stateStrategy !== 'none') {
|
|
213
|
-
const state = getPluginState();
|
|
214
|
-
snapshotId = await this.stateManager.saveState(pluginName, version, state, config);
|
|
215
|
-
this.logger.debug('Plugin state saved', { plugin: pluginName, snapshotId });
|
|
216
|
-
}
|
|
217
|
-
// Gracefully shutdown the plugin
|
|
218
|
-
if (plugin.destroy) {
|
|
219
|
-
this.logger.debug('Destroying plugin', { plugin: pluginName });
|
|
220
|
-
const shutdownPromise = plugin.destroy();
|
|
221
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
222
|
-
setTimeout(() => reject(new Error('Shutdown timeout')), config.shutdownTimeout);
|
|
223
|
-
});
|
|
224
|
-
await Promise.race([shutdownPromise, timeoutPromise]);
|
|
225
|
-
this.logger.debug('Plugin destroyed successfully', { plugin: pluginName });
|
|
226
|
-
}
|
|
227
|
-
// At this point, the kernel would reload the plugin module
|
|
228
|
-
// This would be handled by the plugin loader
|
|
229
|
-
this.logger.debug('Plugin module would be reloaded here', { plugin: pluginName });
|
|
230
|
-
// Restore state if we saved it
|
|
231
|
-
if (snapshotId && config.preserveState) {
|
|
232
|
-
const restoredState = await this.stateManager.restoreState(pluginName, snapshotId);
|
|
233
|
-
if (restoredState) {
|
|
234
|
-
restorePluginState(restoredState);
|
|
235
|
-
this.logger.debug('Plugin state restored', { plugin: pluginName });
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// Call after reload hooks
|
|
239
|
-
if (config.afterReload) {
|
|
240
|
-
this.logger.debug('Executing after reload hooks', {
|
|
241
|
-
plugin: pluginName,
|
|
242
|
-
hooks: config.afterReload
|
|
243
|
-
});
|
|
244
|
-
// Hook execution would be done through kernel's hook system
|
|
245
|
-
}
|
|
246
|
-
this.logger.info('Hot reload completed successfully', { plugin: pluginName });
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
249
|
-
catch (error) {
|
|
250
|
-
this.logger.error('Hot reload failed', {
|
|
251
|
-
plugin: pluginName,
|
|
252
|
-
error
|
|
253
|
-
});
|
|
254
|
-
return false;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Schedule a reload with debouncing
|
|
259
|
-
*/
|
|
260
|
-
scheduleReload(pluginName, reloadFn) {
|
|
261
|
-
const config = this.reloadConfigs.get(pluginName);
|
|
262
|
-
if (!config) {
|
|
263
|
-
return;
|
|
264
|
-
}
|
|
265
|
-
// Clear existing timer
|
|
266
|
-
const existingTimer = this.reloadTimers.get(pluginName);
|
|
267
|
-
if (existingTimer) {
|
|
268
|
-
clearTimeout(existingTimer);
|
|
269
|
-
}
|
|
270
|
-
// Schedule new reload with debounce
|
|
271
|
-
const timer = setTimeout(() => {
|
|
272
|
-
this.logger.debug('Debounce period elapsed, executing reload', {
|
|
273
|
-
plugin: pluginName
|
|
274
|
-
});
|
|
275
|
-
reloadFn().catch(error => {
|
|
276
|
-
this.logger.error('Scheduled reload failed', {
|
|
277
|
-
plugin: pluginName,
|
|
278
|
-
error
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
this.reloadTimers.delete(pluginName);
|
|
282
|
-
}, config.debounceDelay);
|
|
283
|
-
this.reloadTimers.set(pluginName, timer);
|
|
284
|
-
this.logger.debug('Reload scheduled with debounce', {
|
|
285
|
-
plugin: pluginName,
|
|
286
|
-
delay: config.debounceDelay
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Get state manager for direct access
|
|
291
|
-
*/
|
|
292
|
-
getStateManager() {
|
|
293
|
-
return this.stateManager;
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Shutdown hot reload manager
|
|
297
|
-
*/
|
|
298
|
-
shutdown() {
|
|
299
|
-
// Stop all watching
|
|
300
|
-
for (const pluginName of this.watchHandles.keys()) {
|
|
301
|
-
this.stopWatching(pluginName);
|
|
302
|
-
}
|
|
303
|
-
// Clear all timers
|
|
304
|
-
for (const timer of this.reloadTimers.values()) {
|
|
305
|
-
clearTimeout(timer);
|
|
306
|
-
}
|
|
307
|
-
this.reloadConfigs.clear();
|
|
308
|
-
this.watchHandles.clear();
|
|
309
|
-
this.reloadTimers.clear();
|
|
310
|
-
this.stateManager.shutdown();
|
|
311
|
-
this.logger.info('Hot reload manager shutdown complete');
|
|
312
|
-
}
|
|
313
|
-
}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,eAAe,CAAC;AAGpC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AAGzC,YAAY,EACR,MAAM,EACN,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,WAAW,EACX,eAAe,EAClB,MAAM,6BAA6B,CAAC"}
|
package/dist/kernel-base.d.ts
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import type { Plugin, PluginContext } from './types.js';
|
|
2
|
-
import type { Logger } from '@objectstack/spec/contracts';
|
|
3
|
-
import type { IServiceRegistry } from '@objectstack/spec/contracts';
|
|
4
|
-
/**
|
|
5
|
-
* Kernel state machine
|
|
6
|
-
*/
|
|
7
|
-
export type KernelState = 'idle' | 'initializing' | 'running' | 'stopping' | 'stopped';
|
|
8
|
-
/**
|
|
9
|
-
* ObjectKernelBase - Abstract Base Class for Microkernel
|
|
10
|
-
*
|
|
11
|
-
* Provides common functionality for ObjectKernel and LiteKernel:
|
|
12
|
-
* - Plugin management (Map storage)
|
|
13
|
-
* - Dependency resolution (topological sort)
|
|
14
|
-
* - Hook/Event system
|
|
15
|
-
* - Context creation
|
|
16
|
-
* - State validation
|
|
17
|
-
*
|
|
18
|
-
* This eliminates code duplication between the implementations.
|
|
19
|
-
*/
|
|
20
|
-
export declare abstract class ObjectKernelBase {
|
|
21
|
-
protected plugins: Map<string, Plugin>;
|
|
22
|
-
protected services: IServiceRegistry | Map<string, any>;
|
|
23
|
-
protected hooks: Map<string, Array<(...args: any[]) => void | Promise<void>>>;
|
|
24
|
-
protected state: KernelState;
|
|
25
|
-
protected logger: Logger;
|
|
26
|
-
protected context: PluginContext;
|
|
27
|
-
constructor(logger: Logger);
|
|
28
|
-
/**
|
|
29
|
-
* Validate kernel state
|
|
30
|
-
* @param requiredState - Required state for the operation
|
|
31
|
-
* @throws Error if current state doesn't match
|
|
32
|
-
*/
|
|
33
|
-
protected validateState(requiredState: KernelState): void;
|
|
34
|
-
/**
|
|
35
|
-
* Validate kernel is in idle state (for plugin registration)
|
|
36
|
-
*/
|
|
37
|
-
protected validateIdle(): void;
|
|
38
|
-
/**
|
|
39
|
-
* Create the plugin context
|
|
40
|
-
* Subclasses can override to customize context creation
|
|
41
|
-
*/
|
|
42
|
-
protected createContext(): PluginContext;
|
|
43
|
-
/**
|
|
44
|
-
* Resolve plugin dependencies using topological sort
|
|
45
|
-
* @returns Ordered list of plugins (dependencies first)
|
|
46
|
-
*/
|
|
47
|
-
protected resolveDependencies(): Plugin[];
|
|
48
|
-
/**
|
|
49
|
-
* Run plugin init phase
|
|
50
|
-
* @param plugin - Plugin to initialize
|
|
51
|
-
*/
|
|
52
|
-
protected runPluginInit(plugin: Plugin): Promise<void>;
|
|
53
|
-
/**
|
|
54
|
-
* Run plugin start phase
|
|
55
|
-
* @param plugin - Plugin to start
|
|
56
|
-
*/
|
|
57
|
-
protected runPluginStart(plugin: Plugin): Promise<void>;
|
|
58
|
-
/**
|
|
59
|
-
* Run plugin destroy phase
|
|
60
|
-
* @param plugin - Plugin to destroy
|
|
61
|
-
*/
|
|
62
|
-
protected runPluginDestroy(plugin: Plugin): Promise<void>;
|
|
63
|
-
/**
|
|
64
|
-
* Trigger a hook with all registered handlers
|
|
65
|
-
* @param name - Hook name
|
|
66
|
-
* @param args - Arguments to pass to handlers
|
|
67
|
-
*/
|
|
68
|
-
protected triggerHook(name: string, ...args: any[]): Promise<void>;
|
|
69
|
-
/**
|
|
70
|
-
* Get current kernel state
|
|
71
|
-
*/
|
|
72
|
-
getState(): KernelState;
|
|
73
|
-
/**
|
|
74
|
-
* Get all registered plugins
|
|
75
|
-
*/
|
|
76
|
-
getPlugins(): Map<string, Plugin>;
|
|
77
|
-
/**
|
|
78
|
-
* Abstract methods to be implemented by subclasses
|
|
79
|
-
*/
|
|
80
|
-
abstract use(plugin: Plugin): this | Promise<this>;
|
|
81
|
-
abstract bootstrap(): Promise<void>;
|
|
82
|
-
abstract destroy(): Promise<void>;
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=kernel-base.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kernel-base.d.ts","sourceRoot":"","sources":["../src/kernel-base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAEvF;;;;;;;;;;;GAWG;AACH,8BAAsB,gBAAgB;IAClC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IACnD,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAa;IACpE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAa;IAC1F,SAAS,CAAC,KAAK,EAAE,WAAW,CAAU;IACtC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,OAAO,EAAG,aAAa,CAAC;gBAEtB,MAAM,EAAE,MAAM;IAI1B;;;;OAIG;IACH,SAAS,CAAC,aAAa,CAAC,aAAa,EAAE,WAAW,GAAG,IAAI;IAQzD;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IAM9B;;;OAGG;IACH,SAAS,CAAC,aAAa,IAAI,aAAa;IAoDxC;;;OAGG;IACH,SAAS,CAAC,mBAAmB,IAAI,MAAM,EAAE;IA2CzC;;;OAGG;cACa,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D;;;OAGG;cACa,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7D;;;OAGG;cACa,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/D;;;;OAIG;cACa,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxE;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIjC;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAClD,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CACpC"}
|