@zudojs/storage 0.0.1
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 +38 -0
- package/dist/database/connectionPool.core.d.ts.map +1 -0
- package/dist/database/connectionPool.core.js +166 -0
- package/dist/database/connectionPool.core.js.map +1 -0
- package/dist/database/index.d.ts +5 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +5 -0
- package/dist/database/index.js.map +1 -0
- package/dist/health/healthChecker.core.d.ts +53 -0
- package/dist/health/healthChecker.core.d.ts.map +1 -0
- package/dist/health/healthChecker.core.js +84 -0
- package/dist/health/healthChecker.core.js.map +1 -0
- package/dist/health/index.d.ts +6 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +5 -0
- package/dist/health/index.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/index.d.ts +5 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +5 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lifecycle/storageLifecycle.core.d.ts +26 -0
- package/dist/lifecycle/storageLifecycle.core.d.ts.map +1 -0
- package/dist/lifecycle/storageLifecycle.core.js +71 -0
- package/dist/lifecycle/storageLifecycle.core.js.map +1 -0
- package/dist/locking/inMemoryLock.core.d.ts +28 -0
- package/dist/locking/inMemoryLock.core.d.ts.map +1 -0
- package/dist/locking/inMemoryLock.core.js +120 -0
- package/dist/locking/inMemoryLock.core.js.map +1 -0
- package/dist/locking/index.d.ts +5 -0
- package/dist/locking/index.d.ts.map +1 -0
- package/dist/locking/index.js +5 -0
- package/dist/locking/index.js.map +1 -0
- package/dist/objectStorage/index.d.ts +5 -0
- package/dist/objectStorage/index.d.ts.map +1 -0
- package/dist/objectStorage/index.js +5 -0
- package/dist/objectStorage/index.js.map +1 -0
- package/dist/objectStorage/localObjectStorage.core.d.ts +24 -0
- package/dist/objectStorage/localObjectStorage.core.d.ts.map +1 -0
- package/dist/objectStorage/localObjectStorage.core.js +151 -0
- package/dist/objectStorage/localObjectStorage.core.js.map +1 -0
- package/dist/repository/baseRepository.core.d.ts +64 -0
- package/dist/repository/baseRepository.core.d.ts.map +1 -0
- package/dist/repository/baseRepository.core.js +145 -0
- package/dist/repository/baseRepository.core.js.map +1 -0
- package/dist/repository/index.d.ts +6 -0
- package/dist/repository/index.d.ts.map +1 -0
- package/dist/repository/index.js +5 -0
- package/dist/repository/index.js.map +1 -0
- package/dist/serialization/index.d.ts +5 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +5 -0
- package/dist/serialization/index.js.map +1 -0
- package/dist/serialization/jsonSerializer.core.d.ts +21 -0
- package/dist/serialization/jsonSerializer.core.d.ts.map +1 -0
- package/dist/serialization/jsonSerializer.core.js +29 -0
- package/dist/serialization/jsonSerializer.core.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/storage.type.d.ts +9 -0
- package/dist/types/storage.type.d.ts.map +1 -0
- package/dist/types/storage.type.js +9 -0
- package/dist/types/storage.type.js.map +1 -0
- package/package.json +55 -0
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# @zudojs/storage
|
|
2
|
+
|
|
3
|
+
Storage abstractions including database, object storage, repository, serialization, locking, and lifecycle.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @zudojs/storage
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { createStorage } from "@zudojs/storage";
|
|
15
|
+
|
|
16
|
+
const storage = createStorage({
|
|
17
|
+
database: { url: process.env.DATABASE_URL },
|
|
18
|
+
cache: { driver: "memory" },
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const user = await storage.db.user.findUnique({ where: { id } });
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Features
|
|
25
|
+
|
|
26
|
+
- Unified storage abstraction
|
|
27
|
+
- Database client management
|
|
28
|
+
- Object storage (S3, local filesystem)
|
|
29
|
+
- Repository pattern
|
|
30
|
+
- Serialization support
|
|
31
|
+
- Distributed locking
|
|
32
|
+
|
|
33
|
+
## Use Cases
|
|
34
|
+
|
|
35
|
+
- Unified data access layer
|
|
36
|
+
- File and object storage
|
|
37
|
+
- Cache integration
|
|
38
|
+
- Locking for distributed systems
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionPool.core.d.ts","sourceRoot":"","sources":["../../src/database/connectionPool.core.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,UAAU,EACV,qBAAqB,EACrB,SAAS,EACV,MAAM,0BAA0B,CAAC;AAYlC,qBAAa,cAAc;IAavB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZ1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAIlB;IACR,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,MAAM,CAAS;IAEvB,YACmB,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,EACnD,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,EAGzC;IAED,oDAAoD;IAC9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhC;IAED,0CAA0C;IACpC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAwBnC;IAED,6CAA6C;IACvC,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBnD;IAED,qDAAqD;IAC/C,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAO7D;IAED,2BAA2B;IAC3B,QAAQ,IAAI,SAAS,CAOpB;IAED,wCAAwC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAwB3B;IAED,oCAAoC;IAC9B,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,CAAC,CAkBnE;YAEa,gBAAgB;YAMhB,iBAAiB;YAQjB,SAAS;IAQvB,OAAO,CAAC,iBAAiB;CAW1B"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection pool that manages database connections with backpressure.
|
|
3
|
+
*/
|
|
4
|
+
import { StorageError } from "@zudojs/errors";
|
|
5
|
+
/** Default pool options. */
|
|
6
|
+
const DEFAULT_POOL_OPTIONS = {
|
|
7
|
+
min: 2,
|
|
8
|
+
max: 10,
|
|
9
|
+
acquireTimeout: 30_000,
|
|
10
|
+
idleTimeout: 30_000,
|
|
11
|
+
connectionTimeout: 10_000,
|
|
12
|
+
maxLifetime: 0,
|
|
13
|
+
};
|
|
14
|
+
export class ConnectionPool {
|
|
15
|
+
factory;
|
|
16
|
+
options;
|
|
17
|
+
available = [];
|
|
18
|
+
inUse = new Set();
|
|
19
|
+
waitQueue = [];
|
|
20
|
+
connectionIdCounter = 0;
|
|
21
|
+
closed = false;
|
|
22
|
+
constructor(factory, options) {
|
|
23
|
+
this.factory = factory;
|
|
24
|
+
this.options = { ...DEFAULT_POOL_OPTIONS, ...options };
|
|
25
|
+
}
|
|
26
|
+
/** Initialize the pool with minimum connections. */
|
|
27
|
+
async initialize() {
|
|
28
|
+
const initial = Math.min(this.options.min, this.options.max);
|
|
29
|
+
for (let i = 0; i < initial; i++) {
|
|
30
|
+
const conn = await this.createConnection();
|
|
31
|
+
this.available.push(conn);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Acquire a connection from the pool. */
|
|
35
|
+
async acquire() {
|
|
36
|
+
if (this.closed) {
|
|
37
|
+
throw new StorageError("Pool is closed", {
|
|
38
|
+
code: "STORAGE_CONNECTION_POOL_CLOSED",
|
|
39
|
+
statusCode: 503,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
while (this.available.length > 0) {
|
|
43
|
+
const conn = this.available.pop();
|
|
44
|
+
if (await this.isConnectionAlive(conn)) {
|
|
45
|
+
this.inUse.add(conn);
|
|
46
|
+
return conn;
|
|
47
|
+
}
|
|
48
|
+
await this.safeClose(conn);
|
|
49
|
+
}
|
|
50
|
+
if (this.inUse.size < this.options.max) {
|
|
51
|
+
const conn = await this.createConnection();
|
|
52
|
+
this.inUse.add(conn);
|
|
53
|
+
return conn;
|
|
54
|
+
}
|
|
55
|
+
return this.waitForConnection();
|
|
56
|
+
}
|
|
57
|
+
/** Release a connection back to the pool. */
|
|
58
|
+
async release(connection) {
|
|
59
|
+
this.inUse.delete(connection);
|
|
60
|
+
if (this.closed) {
|
|
61
|
+
await this.safeClose(connection);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (this.waitQueue.length > 0) {
|
|
65
|
+
const waiter = this.waitQueue.shift();
|
|
66
|
+
clearTimeout(waiter.timer);
|
|
67
|
+
this.inUse.add(connection);
|
|
68
|
+
waiter.resolve(connection);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this.available.push(connection);
|
|
72
|
+
}
|
|
73
|
+
/** Use a connection and automatically release it. */
|
|
74
|
+
async use(fn) {
|
|
75
|
+
const conn = await this.acquire();
|
|
76
|
+
try {
|
|
77
|
+
return await fn(conn);
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
await this.release(conn);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Get pool statistics. */
|
|
84
|
+
getStats() {
|
|
85
|
+
return {
|
|
86
|
+
total: this.available.length + this.inUse.size,
|
|
87
|
+
idle: this.available.length,
|
|
88
|
+
active: this.inUse.size,
|
|
89
|
+
waiting: this.waitQueue.length,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** Drain all connections gracefully. */
|
|
93
|
+
async drain() {
|
|
94
|
+
this.closed = true;
|
|
95
|
+
for (const waiter of this.waitQueue) {
|
|
96
|
+
clearTimeout(waiter.timer);
|
|
97
|
+
waiter.reject(new Error("Pool is draining"));
|
|
98
|
+
}
|
|
99
|
+
this.waitQueue.length = 0;
|
|
100
|
+
while (this.available.length > 0) {
|
|
101
|
+
const conn = this.available.pop();
|
|
102
|
+
await this.safeClose(conn);
|
|
103
|
+
}
|
|
104
|
+
const drainTimeout = 30_000;
|
|
105
|
+
const start = Date.now();
|
|
106
|
+
while (this.inUse.size > 0 && Date.now() - start < drainTimeout) {
|
|
107
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
108
|
+
}
|
|
109
|
+
for (const conn of this.inUse) {
|
|
110
|
+
await this.safeClose(conn);
|
|
111
|
+
}
|
|
112
|
+
this.inUse.clear();
|
|
113
|
+
}
|
|
114
|
+
/** Check if the pool is healthy. */
|
|
115
|
+
async healthCheck() {
|
|
116
|
+
const stats = this.getStats();
|
|
117
|
+
if (this.available.length === 0 && this.inUse.size === 0) {
|
|
118
|
+
try {
|
|
119
|
+
const conn = await this.createConnection();
|
|
120
|
+
this.available.push(conn);
|
|
121
|
+
return { healthy: true, stats: this.getStats() };
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return { healthy: false, stats };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (const conn of this.available) {
|
|
128
|
+
if (await this.isConnectionAlive(conn))
|
|
129
|
+
return { healthy: true, stats };
|
|
130
|
+
}
|
|
131
|
+
return { healthy: this.inUse.size > 0, stats };
|
|
132
|
+
}
|
|
133
|
+
async createConnection() {
|
|
134
|
+
const conn = await this.factory();
|
|
135
|
+
this.connectionIdCounter++;
|
|
136
|
+
return conn;
|
|
137
|
+
}
|
|
138
|
+
async isConnectionAlive(conn) {
|
|
139
|
+
try {
|
|
140
|
+
return await conn.ping();
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async safeClose(conn) {
|
|
147
|
+
try {
|
|
148
|
+
await conn.close();
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
/* Ignore close errors */
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
waitForConnection() {
|
|
155
|
+
return new Promise((resolve, reject) => {
|
|
156
|
+
const timer = setTimeout(() => {
|
|
157
|
+
const idx = this.waitQueue.findIndex((w) => w.resolve === resolve);
|
|
158
|
+
if (idx !== -1)
|
|
159
|
+
this.waitQueue.splice(idx, 1);
|
|
160
|
+
reject(new Error("Acquire timeout: no connection available"));
|
|
161
|
+
}, this.options.acquireTimeout);
|
|
162
|
+
this.waitQueue.push({ resolve, reject, timer });
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=connectionPool.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionPool.core.js","sourceRoot":"","sources":["../../src/database/connectionPool.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/storage — Health Checker
|
|
3
|
+
*
|
|
4
|
+
* Aggregates health checks from multiple storage components.
|
|
5
|
+
*/
|
|
6
|
+
import type { StorageHealth, StorageLifecycle } from "../types/storage.type.js";
|
|
7
|
+
/**
|
|
8
|
+
* Result of checking multiple storage components.
|
|
9
|
+
*/
|
|
10
|
+
export interface StorageHealthReport {
|
|
11
|
+
/** Overall health status. */
|
|
12
|
+
readonly healthy: boolean;
|
|
13
|
+
/** Individual component health results. */
|
|
14
|
+
readonly components: readonly ComponentHealth[];
|
|
15
|
+
/** Total check duration in milliseconds. */
|
|
16
|
+
readonly durationMs: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Health result for a single component.
|
|
20
|
+
*/
|
|
21
|
+
export interface ComponentHealth {
|
|
22
|
+
/** Component name. */
|
|
23
|
+
readonly name: string;
|
|
24
|
+
/** Health status. */
|
|
25
|
+
readonly health: StorageHealth;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Aggregates health checks from multiple storage components.
|
|
29
|
+
*/
|
|
30
|
+
export declare class HealthChecker {
|
|
31
|
+
private readonly components;
|
|
32
|
+
/**
|
|
33
|
+
* Register a component for health checking.
|
|
34
|
+
*/
|
|
35
|
+
register(name: string, component: StorageLifecycle): void;
|
|
36
|
+
/**
|
|
37
|
+
* Remove a component from health checking.
|
|
38
|
+
*/
|
|
39
|
+
unregister(name: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Check health of all registered components.
|
|
42
|
+
*/
|
|
43
|
+
checkAll(): Promise<StorageHealthReport>;
|
|
44
|
+
/**
|
|
45
|
+
* Check health of a single component.
|
|
46
|
+
*/
|
|
47
|
+
checkOne(name: string): Promise<StorageHealth | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Get names of all registered components.
|
|
50
|
+
*/
|
|
51
|
+
getRegisteredComponents(): readonly string[];
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=healthChecker.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthChecker.core.d.ts","sourceRoot":"","sources":["../../src/health/healthChecker.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,4CAA4C;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuC;IAElE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAExD;IAED;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7B;IAED;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAkC7C;IAED;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAgB1D;IAED;;OAEG;IACH,uBAAuB,IAAI,SAAS,MAAM,EAAE,CAE3C;CACF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/storage — Health Checker
|
|
3
|
+
*
|
|
4
|
+
* Aggregates health checks from multiple storage components.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Aggregates health checks from multiple storage components.
|
|
8
|
+
*/
|
|
9
|
+
export class HealthChecker {
|
|
10
|
+
components = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Register a component for health checking.
|
|
13
|
+
*/
|
|
14
|
+
register(name, component) {
|
|
15
|
+
this.components.set(name, component);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Remove a component from health checking.
|
|
19
|
+
*/
|
|
20
|
+
unregister(name) {
|
|
21
|
+
this.components.delete(name);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check health of all registered components.
|
|
25
|
+
*/
|
|
26
|
+
async checkAll() {
|
|
27
|
+
const start = Date.now();
|
|
28
|
+
const results = [];
|
|
29
|
+
const checks = Array.from(this.components.entries()).map(async ([name, component]) => {
|
|
30
|
+
try {
|
|
31
|
+
const health = await component.healthCheck();
|
|
32
|
+
results.push({ name, health });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
results.push({
|
|
36
|
+
name,
|
|
37
|
+
health: {
|
|
38
|
+
healthy: false,
|
|
39
|
+
latencyMs: 0,
|
|
40
|
+
status: "error",
|
|
41
|
+
details: {
|
|
42
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
await Promise.allSettled(checks);
|
|
49
|
+
const healthy = results.every((r) => r.health.healthy);
|
|
50
|
+
return {
|
|
51
|
+
healthy,
|
|
52
|
+
components: results,
|
|
53
|
+
durationMs: Date.now() - start,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check health of a single component.
|
|
58
|
+
*/
|
|
59
|
+
async checkOne(name) {
|
|
60
|
+
const component = this.components.get(name);
|
|
61
|
+
if (!component)
|
|
62
|
+
return null;
|
|
63
|
+
try {
|
|
64
|
+
return await component.healthCheck();
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return {
|
|
68
|
+
healthy: false,
|
|
69
|
+
latencyMs: 0,
|
|
70
|
+
status: "error",
|
|
71
|
+
details: {
|
|
72
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get names of all registered components.
|
|
79
|
+
*/
|
|
80
|
+
getRegisteredComponents() {
|
|
81
|
+
return Array.from(this.components.keys());
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=healthChecker.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthChecker.core.js","sourceRoot":"","sources":["../../src/health/healthChecker.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0BH;;GAEG;AACH,MAAM,OAAO,aAAa;IACP,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IAElE;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,SAA2B;QAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CACtD,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,MAAM,EAAE;wBACN,OAAO,EAAE,KAAK;wBACd,SAAS,EAAE,CAAC;wBACZ,MAAM,EAAE,OAAO;wBACf,OAAO,EAAE;4BACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;yBAChE;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEjC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvD,OAAO;YACL,OAAO;YACP,UAAU,EAAE,OAAO;YACnB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC/B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE;oBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAChE;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,uBAAuB;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/health/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EACV,mBAAmB,EACnB,eAAe,GAChB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/health/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/storage
|
|
3
|
+
*
|
|
4
|
+
* Storage infrastructure for the Zudojs framework.
|
|
5
|
+
*
|
|
6
|
+
* Provides database, object storage, repository, serialization, locking,
|
|
7
|
+
* and lifecycle abstractions with driver-independent interfaces.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Database, ConnectionPool, BaseRepository } from '@zudojs/storage';
|
|
12
|
+
*
|
|
13
|
+
* // Use database abstraction
|
|
14
|
+
* const result = await database.query({ text: 'SELECT * FROM users' });
|
|
15
|
+
*
|
|
16
|
+
* // Use repository pattern
|
|
17
|
+
* class UserRepository extends BaseRepository<User, string> {
|
|
18
|
+
* async findByEmail(email: string) {
|
|
19
|
+
* return this.database.query({
|
|
20
|
+
* text: 'SELECT * FROM users WHERE email = $1',
|
|
21
|
+
* parameters: [email],
|
|
22
|
+
* });
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @packageDocumentation
|
|
28
|
+
*/
|
|
29
|
+
export type { ConnectionState, TransactionState, IsolationLevel, QueryParameter, Query, QueryResult, ExecuteResult, FieldInfo, Connection, ConnectionPoolOptions, PoolStats, TransactionOptions, Transaction, StorageHealth, Database, ObjectPutOptions, ObjectMetadata, ObjectData, ObjectStorage, ListObjectsResult, Repository, SerializationFormat, Serializer, Lock, LockOptions, LockManager, StorageLifecyclePhase, StorageLifecycle, StorageContext, } from "./types/index.js";
|
|
30
|
+
export { ConnectionPool } from "./database/index.js";
|
|
31
|
+
export { BaseRepository } from "./repository/index.js";
|
|
32
|
+
export type { BaseRepositoryOptions } from "./repository/index.js";
|
|
33
|
+
export { LocalObjectStorage } from "./objectStorage/index.js";
|
|
34
|
+
export { JsonSerializer } from "./serialization/index.js";
|
|
35
|
+
export { InMemoryLockManager } from "./locking/index.js";
|
|
36
|
+
export { StorageLifecycleManager } from "./lifecycle/index.js";
|
|
37
|
+
export { HealthChecker } from "./health/index.js";
|
|
38
|
+
export type { StorageHealthReport, ComponentHealth } from "./health/index.js";
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,KAAK,EACL,WAAW,EACX,aAAa,EACb,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,UAAU,EACV,IAAI,EACJ,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/storage
|
|
3
|
+
*
|
|
4
|
+
* Storage infrastructure for the Zudojs framework.
|
|
5
|
+
*
|
|
6
|
+
* Provides database, object storage, repository, serialization, locking,
|
|
7
|
+
* and lifecycle abstractions with driver-independent interfaces.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Database, ConnectionPool, BaseRepository } from '@zudojs/storage';
|
|
12
|
+
*
|
|
13
|
+
* // Use database abstraction
|
|
14
|
+
* const result = await database.query({ text: 'SELECT * FROM users' });
|
|
15
|
+
*
|
|
16
|
+
* // Use repository pattern
|
|
17
|
+
* class UserRepository extends BaseRepository<User, string> {
|
|
18
|
+
* async findByEmail(email: string) {
|
|
19
|
+
* return this.database.query({
|
|
20
|
+
* text: 'SELECT * FROM users WHERE email = $1',
|
|
21
|
+
* parameters: [email],
|
|
22
|
+
* });
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @packageDocumentation
|
|
28
|
+
*/
|
|
29
|
+
export { ConnectionPool } from "./database/index.js";
|
|
30
|
+
export { BaseRepository } from "./repository/index.js";
|
|
31
|
+
export { LocalObjectStorage } from "./objectStorage/index.js";
|
|
32
|
+
export { JsonSerializer } from "./serialization/index.js";
|
|
33
|
+
export { InMemoryLockManager } from "./locking/index.js";
|
|
34
|
+
export { StorageLifecycleManager } from "./lifecycle/index.js";
|
|
35
|
+
export { HealthChecker } from "./health/index.js";
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAmCH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/storage — Storage Lifecycle Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle phases of storage components:
|
|
5
|
+
* uninitialized → initializing → ready → draining → drained → shutdown
|
|
6
|
+
*/
|
|
7
|
+
import type { StorageLifecycle, StorageLifecyclePhase, StorageHealth } from "../types/storage.type.js";
|
|
8
|
+
/**
|
|
9
|
+
* Lifecycle manager that coordinates storage component initialization,
|
|
10
|
+
* draining, and shutdown.
|
|
11
|
+
*/
|
|
12
|
+
export declare class StorageLifecycleManager implements StorageLifecycle {
|
|
13
|
+
private phase;
|
|
14
|
+
private readonly components;
|
|
15
|
+
/**
|
|
16
|
+
* Register a storage component for lifecycle management.
|
|
17
|
+
*/
|
|
18
|
+
register(component: StorageLifecycle): void;
|
|
19
|
+
initialize(): Promise<void>;
|
|
20
|
+
start(): Promise<void>;
|
|
21
|
+
healthCheck(): Promise<StorageHealth>;
|
|
22
|
+
drain(): Promise<void>;
|
|
23
|
+
shutdown(): Promise<void>;
|
|
24
|
+
getPhase(): StorageLifecyclePhase;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=storageLifecycle.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storageLifecycle.core.d.ts","sourceRoot":"","sources":["../../src/lifecycle/storageLifecycle.core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACd,MAAM,0BAA0B,CAAC;AAElC;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IAErD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAE1C;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAEK,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,CAyB1C;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAG9B;IAED,QAAQ,IAAI,qBAAqB,CAEhC;CACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/storage — Storage Lifecycle Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle phases of storage components:
|
|
5
|
+
* uninitialized → initializing → ready → draining → drained → shutdown
|
|
6
|
+
*/
|
|
7
|
+
import { StorageError } from "@zudojs/errors";
|
|
8
|
+
/**
|
|
9
|
+
* Lifecycle manager that coordinates storage component initialization,
|
|
10
|
+
* draining, and shutdown.
|
|
11
|
+
*/
|
|
12
|
+
export class StorageLifecycleManager {
|
|
13
|
+
phase = "uninitialized";
|
|
14
|
+
components = [];
|
|
15
|
+
/**
|
|
16
|
+
* Register a storage component for lifecycle management.
|
|
17
|
+
*/
|
|
18
|
+
register(component) {
|
|
19
|
+
this.components.push(component);
|
|
20
|
+
}
|
|
21
|
+
async initialize() {
|
|
22
|
+
this.phase = "initializing";
|
|
23
|
+
for (const component of this.components) {
|
|
24
|
+
await component.initialize();
|
|
25
|
+
}
|
|
26
|
+
this.phase = "ready";
|
|
27
|
+
}
|
|
28
|
+
async start() {
|
|
29
|
+
if (this.phase !== "ready") {
|
|
30
|
+
throw new StorageError(`Cannot start from phase: ${this.phase}`, {
|
|
31
|
+
code: "STORAGE_LIFECYCLE_INVALID_PHASE",
|
|
32
|
+
statusCode: 500,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
for (const component of this.components) {
|
|
36
|
+
await component.start();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async healthCheck() {
|
|
40
|
+
const results = await Promise.allSettled(this.components.map((c) => c.healthCheck()));
|
|
41
|
+
const healthy = results.every((r) => r.status === "fulfilled" && r.value.healthy);
|
|
42
|
+
const latencyMs = results.reduce((max, r) => {
|
|
43
|
+
if (r.status === "fulfilled") {
|
|
44
|
+
return Math.max(max, r.value.latencyMs);
|
|
45
|
+
}
|
|
46
|
+
return max;
|
|
47
|
+
}, 0);
|
|
48
|
+
return {
|
|
49
|
+
healthy,
|
|
50
|
+
latencyMs,
|
|
51
|
+
status: this.phase,
|
|
52
|
+
details: {
|
|
53
|
+
componentCount: this.components.length,
|
|
54
|
+
phases: this.components.map((c) => c.getPhase()),
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async drain() {
|
|
59
|
+
this.phase = "draining";
|
|
60
|
+
await Promise.all(this.components.map((c) => c.drain()));
|
|
61
|
+
this.phase = "drained";
|
|
62
|
+
}
|
|
63
|
+
async shutdown() {
|
|
64
|
+
this.phase = "shutdown";
|
|
65
|
+
await Promise.all(this.components.map((c) => c.shutdown()));
|
|
66
|
+
}
|
|
67
|
+
getPhase() {
|
|
68
|
+
return this.phase;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=storageLifecycle.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storageLifecycle.core.js","sourceRoot":"","sources":["../../src/lifecycle/storageLifecycle.core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9C;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAC1B,KAAK,GAA0B,eAAe,CAAC;IACtC,UAAU,GAAuB,EAAE,CAAC;IAErD;;OAEG;IACH,QAAQ,CAAC,SAA2B;QAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC;QAC5B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,YAAY,CAAC,4BAA4B,IAAI,CAAC,KAAK,EAAE,EAAE;gBAC/D,IAAI,EAAE,iCAAiC;gBACvC,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAC5C,CAAC;QAEF,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CACnD,CAAC;QAEF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC1C,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,OAAO;YACP,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,KAAK;YAClB,OAAO,EAAE;gBACP,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;gBACtC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;aACjD;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/storage — In-Memory Lock Manager
|
|
3
|
+
*
|
|
4
|
+
* Provides distributed-style locking for single-process scenarios.
|
|
5
|
+
* For multi-process/multi-node, replace with Redis/Database-backed lock.
|
|
6
|
+
*/
|
|
7
|
+
import type { Lock, LockManager, LockOptions } from "../types/storage.type.js";
|
|
8
|
+
/**
|
|
9
|
+
* In-memory lock manager implementation.
|
|
10
|
+
*/
|
|
11
|
+
export declare class InMemoryLockManager implements LockManager {
|
|
12
|
+
private readonly locks;
|
|
13
|
+
private readonly waitQueues;
|
|
14
|
+
acquire(resource: string, options?: LockOptions): Promise<Lock>;
|
|
15
|
+
tryAcquire(resource: string, ttlMs: number): Promise<Lock | null>;
|
|
16
|
+
isLocked(resource: string): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Clean up expired locks.
|
|
19
|
+
*/
|
|
20
|
+
cleanup(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Release all locks and clean up.
|
|
23
|
+
*/
|
|
24
|
+
clear(): void;
|
|
25
|
+
private tryAcquireLock;
|
|
26
|
+
private notifyWaiters;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=inMemoryLock.core.d.ts.map
|