@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.
Files changed (69) hide show
  1. package/README.md +38 -0
  2. package/dist/database/connectionPool.core.d.ts.map +1 -0
  3. package/dist/database/connectionPool.core.js +166 -0
  4. package/dist/database/connectionPool.core.js.map +1 -0
  5. package/dist/database/index.d.ts +5 -0
  6. package/dist/database/index.d.ts.map +1 -0
  7. package/dist/database/index.js +5 -0
  8. package/dist/database/index.js.map +1 -0
  9. package/dist/health/healthChecker.core.d.ts +53 -0
  10. package/dist/health/healthChecker.core.d.ts.map +1 -0
  11. package/dist/health/healthChecker.core.js +84 -0
  12. package/dist/health/healthChecker.core.js.map +1 -0
  13. package/dist/health/index.d.ts +6 -0
  14. package/dist/health/index.d.ts.map +1 -0
  15. package/dist/health/index.js +5 -0
  16. package/dist/health/index.js.map +1 -0
  17. package/dist/index.d.ts +39 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +36 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/lifecycle/index.d.ts +5 -0
  22. package/dist/lifecycle/index.d.ts.map +1 -0
  23. package/dist/lifecycle/index.js +5 -0
  24. package/dist/lifecycle/index.js.map +1 -0
  25. package/dist/lifecycle/storageLifecycle.core.d.ts +26 -0
  26. package/dist/lifecycle/storageLifecycle.core.d.ts.map +1 -0
  27. package/dist/lifecycle/storageLifecycle.core.js +71 -0
  28. package/dist/lifecycle/storageLifecycle.core.js.map +1 -0
  29. package/dist/locking/inMemoryLock.core.d.ts +28 -0
  30. package/dist/locking/inMemoryLock.core.d.ts.map +1 -0
  31. package/dist/locking/inMemoryLock.core.js +120 -0
  32. package/dist/locking/inMemoryLock.core.js.map +1 -0
  33. package/dist/locking/index.d.ts +5 -0
  34. package/dist/locking/index.d.ts.map +1 -0
  35. package/dist/locking/index.js +5 -0
  36. package/dist/locking/index.js.map +1 -0
  37. package/dist/objectStorage/index.d.ts +5 -0
  38. package/dist/objectStorage/index.d.ts.map +1 -0
  39. package/dist/objectStorage/index.js +5 -0
  40. package/dist/objectStorage/index.js.map +1 -0
  41. package/dist/objectStorage/localObjectStorage.core.d.ts +24 -0
  42. package/dist/objectStorage/localObjectStorage.core.d.ts.map +1 -0
  43. package/dist/objectStorage/localObjectStorage.core.js +151 -0
  44. package/dist/objectStorage/localObjectStorage.core.js.map +1 -0
  45. package/dist/repository/baseRepository.core.d.ts +64 -0
  46. package/dist/repository/baseRepository.core.d.ts.map +1 -0
  47. package/dist/repository/baseRepository.core.js +145 -0
  48. package/dist/repository/baseRepository.core.js.map +1 -0
  49. package/dist/repository/index.d.ts +6 -0
  50. package/dist/repository/index.d.ts.map +1 -0
  51. package/dist/repository/index.js +5 -0
  52. package/dist/repository/index.js.map +1 -0
  53. package/dist/serialization/index.d.ts +5 -0
  54. package/dist/serialization/index.d.ts.map +1 -0
  55. package/dist/serialization/index.js +5 -0
  56. package/dist/serialization/index.js.map +1 -0
  57. package/dist/serialization/jsonSerializer.core.d.ts +21 -0
  58. package/dist/serialization/jsonSerializer.core.d.ts.map +1 -0
  59. package/dist/serialization/jsonSerializer.core.js +29 -0
  60. package/dist/serialization/jsonSerializer.core.js.map +1 -0
  61. package/dist/types/index.d.ts +7 -0
  62. package/dist/types/index.d.ts.map +1 -0
  63. package/dist/types/index.js +7 -0
  64. package/dist/types/index.js.map +1 -0
  65. package/dist/types/storage.type.d.ts +9 -0
  66. package/dist/types/storage.type.d.ts.map +1 -0
  67. package/dist/types/storage.type.js +9 -0
  68. package/dist/types/storage.type.js.map +1 -0
  69. 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,5 @@
1
+ /**
2
+ * @zudojs/storage — Database Barrel
3
+ */
4
+ export { ConnectionPool } from "./connectionPool.core.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * @zudojs/storage — Database Barrel
3
+ */
4
+ export { ConnectionPool } from "./connectionPool.core.js";
5
+ //# sourceMappingURL=index.js.map
@@ -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,6 @@
1
+ /**
2
+ * @zudojs/storage — Health Barrel
3
+ */
4
+ export { HealthChecker } from "./healthChecker.core.js";
5
+ export type { StorageHealthReport, ComponentHealth, } from "./healthChecker.core.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * @zudojs/storage — Health Barrel
3
+ */
4
+ export { HealthChecker } from "./healthChecker.core.js";
5
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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,5 @@
1
+ /**
2
+ * @zudojs/storage — Lifecycle Barrel
3
+ */
4
+ export { StorageLifecycleManager } from "./storageLifecycle.core.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * @zudojs/storage — Lifecycle Barrel
3
+ */
4
+ export { StorageLifecycleManager } from "./storageLifecycle.core.js";
5
+ //# sourceMappingURL=index.js.map
@@ -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