@mediar-ai/kv 0.23.12
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 +115 -0
- package/dist/adapters/file.d.ts +27 -0
- package/dist/adapters/file.d.ts.map +1 -0
- package/dist/adapters/file.js +336 -0
- package/dist/adapters/file.js.map +1 -0
- package/dist/adapters/memory.d.ts +22 -0
- package/dist/adapters/memory.d.ts.map +1 -0
- package/dist/adapters/memory.js +187 -0
- package/dist/adapters/memory.js.map +1 -0
- package/dist/adapters/redis.d.ts +20 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +86 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# @mediar-ai/kv
|
|
2
|
+
|
|
3
|
+
A lightweight, pluggable Key-Value store for Terminator workflows. This package enables state sharing between concurrent workflow executions, allowing for coordination, locking, and progress tracking.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
* **Pluggable Backends**: Switch between Redis (production), File-system (local persistence), and Memory (testing) without changing code.
|
|
8
|
+
* **Unified API**: Simple `get`, `set`, `del` API inspired by Vercel KV / Redis.
|
|
9
|
+
* **Atomic Operations**: Supports `NX` (Not Exists) and `XX` (Already Exists) for locking.
|
|
10
|
+
* **Zero Config**: Defaults to a local file-based store if no configuration is provided.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install @mediar-ai/kv
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
### Basic Example
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { kv } from '@mediar-ai/kv';
|
|
24
|
+
|
|
25
|
+
async function main() {
|
|
26
|
+
// Set a value
|
|
27
|
+
await kv.set('user:123', 'Alice');
|
|
28
|
+
|
|
29
|
+
// Get a value
|
|
30
|
+
const user = await kv.get('user:123');
|
|
31
|
+
console.log(user); // 'Alice'
|
|
32
|
+
|
|
33
|
+
// Atomic Lock (useful for preventing race conditions)
|
|
34
|
+
const acquired = await kv.set('lock:resource:A', 'locked', { nx: true, ex: 60 });
|
|
35
|
+
|
|
36
|
+
if (acquired) {
|
|
37
|
+
try {
|
|
38
|
+
console.log('Lock acquired, doing work...');
|
|
39
|
+
} finally {
|
|
40
|
+
await kv.del('lock:resource:A');
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
console.log('Could not acquire lock.');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### List Operations (Queues)
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
await kv.lpush('queue:invoices', 'inv_001', 'inv_002');
|
|
52
|
+
const nextItem = await kv.rpop('queue:invoices');
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Hash Operations
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
await kv.hset('invoice:inv_001', {
|
|
59
|
+
status: 'processing',
|
|
60
|
+
amount: 100.50,
|
|
61
|
+
vendor: 'Acme Corp'
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const status = await kv.hget('invoice:inv_001', 'status');
|
|
65
|
+
const allData = await kv.hgetall('invoice:inv_001');
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Configuration
|
|
69
|
+
|
|
70
|
+
The client automatically detects the configuration based on environment variables or defaults.
|
|
71
|
+
|
|
72
|
+
### Environment Variables
|
|
73
|
+
|
|
74
|
+
Set `KV_URL` or `REDIS_URL` to configure the backend.
|
|
75
|
+
|
|
76
|
+
* **Redis**: `redis://localhost:6379`
|
|
77
|
+
* **File**: `file://./my-db.json`
|
|
78
|
+
* **Memory**: `memory://`
|
|
79
|
+
|
|
80
|
+
### Manual Initialization
|
|
81
|
+
|
|
82
|
+
You can also create a custom client instance:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { createClient } from '@mediar-ai/kv';
|
|
86
|
+
|
|
87
|
+
// Redis
|
|
88
|
+
const redisKv = createClient({ url: 'redis://user:pass@host:6379' });
|
|
89
|
+
|
|
90
|
+
// File (Persistent local JSON file)
|
|
91
|
+
const fileKv = createClient({ url: 'file://./data/workflow-state.json' });
|
|
92
|
+
|
|
93
|
+
// Memory (Ephemeral, good for tests)
|
|
94
|
+
const memKv = createClient({ backend: 'memory' });
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## API Reference
|
|
98
|
+
|
|
99
|
+
* `set(key, value, { ex?, nx?, xx? })`: Set value with optional TTL (seconds) and conditions.
|
|
100
|
+
* `get(key)`: Get string value.
|
|
101
|
+
* `del(key)`: Delete key.
|
|
102
|
+
* `expire(key, seconds)`: Set expiry on existing key.
|
|
103
|
+
* `incr(key)`: Increment integer value.
|
|
104
|
+
* `lpush(key, ...elements)`: Prepend to list.
|
|
105
|
+
* `rpush(key, ...elements)`: Append to list.
|
|
106
|
+
* `lpop(key)`: Remove and return first element.
|
|
107
|
+
* `rpop(key)`: Remove and return last element.
|
|
108
|
+
* `hset(key, field, value)` or `hset(key, object)`: Set hash fields.
|
|
109
|
+
* `hget(key, field)`: Get hash field.
|
|
110
|
+
* `hgetall(key)`: Get all fields in hash.
|
|
111
|
+
* `hincrby(key, field, increment)`: Increment hash field.
|
|
112
|
+
|
|
113
|
+
## License
|
|
114
|
+
|
|
115
|
+
MIT
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { KVClient, SetOptions, KVConfig } from '../types';
|
|
2
|
+
export declare class FileKV implements KVClient {
|
|
3
|
+
private filePath;
|
|
4
|
+
private lockFile;
|
|
5
|
+
private lockStaleTime;
|
|
6
|
+
private retryInterval;
|
|
7
|
+
private maxRetries;
|
|
8
|
+
constructor(config: KVConfig);
|
|
9
|
+
private acquireLock;
|
|
10
|
+
private releaseLock;
|
|
11
|
+
private withLock;
|
|
12
|
+
get(key: string): Promise<string | null>;
|
|
13
|
+
set(key: string, value: string | number, options?: SetOptions): Promise<string | null>;
|
|
14
|
+
del(key: string): Promise<number>;
|
|
15
|
+
expire(key: string, seconds: number): Promise<number>;
|
|
16
|
+
lpush(key: string, ...elements: (string | number)[]): Promise<number>;
|
|
17
|
+
rpush(key: string, ...elements: (string | number)[]): Promise<number>;
|
|
18
|
+
lpop(key: string): Promise<string | null>;
|
|
19
|
+
rpop(key: string): Promise<string | null>;
|
|
20
|
+
hset(key: string, arg1: string | Record<string, string | number>, arg2?: string | number): Promise<number>;
|
|
21
|
+
hget(key: string, field: string): Promise<string | null>;
|
|
22
|
+
hgetall(key: string): Promise<Record<string, string>>;
|
|
23
|
+
hincrby(key: string, field: string, increment: number): Promise<number>;
|
|
24
|
+
incr(key: string): Promise<number>;
|
|
25
|
+
disconnect(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/adapters/file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAS1D,qBAAa,MAAO,YAAW,QAAQ;IACrC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,UAAU,CAAO;gBAEb,MAAM,EAAE,QAAQ;YAoBd,WAAW;YAiCX,WAAW;YAQX,QAAQ;IA2ChB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoBtF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWjC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQrD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBrE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBrE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAezC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAezC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB1G,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWxD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAUrD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBvE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAelC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.FileKV = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class FileKV {
|
|
40
|
+
constructor(config) {
|
|
41
|
+
this.lockStaleTime = 5000; // 5 seconds lock timeout
|
|
42
|
+
this.retryInterval = 50;
|
|
43
|
+
this.maxRetries = 100; // ~5 seconds total wait
|
|
44
|
+
let p = config.url || 'file://./terminator-kv.json';
|
|
45
|
+
if (p.startsWith('file://')) {
|
|
46
|
+
p = p.slice(7);
|
|
47
|
+
}
|
|
48
|
+
// Handle relative paths correctly
|
|
49
|
+
this.filePath = path.resolve(process.cwd(), p);
|
|
50
|
+
this.lockFile = `${this.filePath}.lock`;
|
|
51
|
+
// Initialize if not exists
|
|
52
|
+
if (!fs.existsSync(this.filePath)) {
|
|
53
|
+
// We use sync here to ensure it's ready immediately
|
|
54
|
+
try {
|
|
55
|
+
fs.writeFileSync(this.filePath, JSON.stringify({ data: {}, expiry: {} }));
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
// Ignore error if created in parallel
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async acquireLock() {
|
|
63
|
+
let retries = 0;
|
|
64
|
+
while (retries < this.maxRetries) {
|
|
65
|
+
try {
|
|
66
|
+
// 'wx' flag fails if path exists
|
|
67
|
+
await fs.promises.writeFile(this.lockFile, String(Date.now()), { flag: 'wx' });
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
if (e.code === 'EEXIST') {
|
|
72
|
+
// Check if lock is stale
|
|
73
|
+
try {
|
|
74
|
+
const created = parseInt(await fs.promises.readFile(this.lockFile, 'utf8'), 10);
|
|
75
|
+
if (Date.now() - created > this.lockStaleTime) {
|
|
76
|
+
// Lock is stale, try to remove it and retry immediately
|
|
77
|
+
try {
|
|
78
|
+
await fs.promises.unlink(this.lockFile);
|
|
79
|
+
}
|
|
80
|
+
catch (ignore) { }
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
// Lock file might have been deleted in between, retry
|
|
86
|
+
}
|
|
87
|
+
await new Promise(r => setTimeout(r, this.retryInterval));
|
|
88
|
+
retries++;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
throw e;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw new Error(`Could not acquire lock on ${this.lockFile} after ${this.maxRetries} attempts`);
|
|
96
|
+
}
|
|
97
|
+
async releaseLock() {
|
|
98
|
+
try {
|
|
99
|
+
await fs.promises.unlink(this.lockFile);
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
// Ignore if already gone
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async withLock(operation) {
|
|
106
|
+
await this.acquireLock();
|
|
107
|
+
try {
|
|
108
|
+
let content = '{}';
|
|
109
|
+
try {
|
|
110
|
+
content = await fs.promises.readFile(this.filePath, 'utf8');
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
// If read fails, assume empty or corrupt, reset to default
|
|
114
|
+
content = JSON.stringify({ data: {}, expiry: {} });
|
|
115
|
+
}
|
|
116
|
+
let store;
|
|
117
|
+
try {
|
|
118
|
+
store = JSON.parse(content);
|
|
119
|
+
if (!store.data)
|
|
120
|
+
store.data = {};
|
|
121
|
+
if (!store.expiry)
|
|
122
|
+
store.expiry = {};
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
store = { data: {}, expiry: {} };
|
|
126
|
+
}
|
|
127
|
+
// Clean expired keys lazily
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
let cleaned = false;
|
|
130
|
+
for (const key in store.expiry) {
|
|
131
|
+
if (store.expiry[key] <= now) {
|
|
132
|
+
delete store.expiry[key];
|
|
133
|
+
delete store.data[key];
|
|
134
|
+
cleaned = true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const { result, modified } = await operation(store);
|
|
138
|
+
if (modified || cleaned) {
|
|
139
|
+
await fs.promises.writeFile(this.filePath, JSON.stringify(store, null, 2));
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
await this.releaseLock();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async get(key) {
|
|
148
|
+
return this.withLock(async (store) => {
|
|
149
|
+
const val = store.data[key];
|
|
150
|
+
if (val === undefined)
|
|
151
|
+
return { result: null, modified: false };
|
|
152
|
+
if (typeof val !== 'string' && typeof val !== 'number')
|
|
153
|
+
return { result: null, modified: false };
|
|
154
|
+
return { result: String(val), modified: false };
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async set(key, value, options) {
|
|
158
|
+
return this.withLock(async (store) => {
|
|
159
|
+
const exists = key in store.data;
|
|
160
|
+
if (options?.nx && exists)
|
|
161
|
+
return { result: null, modified: false };
|
|
162
|
+
if (options?.xx && !exists)
|
|
163
|
+
return { result: null, modified: false };
|
|
164
|
+
store.data[key] = String(value);
|
|
165
|
+
if (options?.ex) {
|
|
166
|
+
store.expiry[key] = Date.now() + (options.ex * 1000);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Clear expiry if it existed
|
|
170
|
+
delete store.expiry[key];
|
|
171
|
+
}
|
|
172
|
+
return { result: 'OK', modified: true };
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
async del(key) {
|
|
176
|
+
return this.withLock(async (store) => {
|
|
177
|
+
if (key in store.data) {
|
|
178
|
+
delete store.data[key];
|
|
179
|
+
delete store.expiry[key];
|
|
180
|
+
return { result: 1, modified: true };
|
|
181
|
+
}
|
|
182
|
+
return { result: 0, modified: false };
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
async expire(key, seconds) {
|
|
186
|
+
return this.withLock(async (store) => {
|
|
187
|
+
if (!(key in store.data))
|
|
188
|
+
return { result: 0, modified: false };
|
|
189
|
+
store.expiry[key] = Date.now() + (seconds * 1000);
|
|
190
|
+
return { result: 1, modified: true };
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
async lpush(key, ...elements) {
|
|
194
|
+
return this.withLock(async (store) => {
|
|
195
|
+
let list = store.data[key];
|
|
196
|
+
if (list === undefined) {
|
|
197
|
+
list = [];
|
|
198
|
+
store.data[key] = list;
|
|
199
|
+
}
|
|
200
|
+
if (!Array.isArray(list))
|
|
201
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
202
|
+
const strings = elements.map(String);
|
|
203
|
+
list.unshift(...strings);
|
|
204
|
+
return { result: list.length, modified: true };
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
async rpush(key, ...elements) {
|
|
208
|
+
return this.withLock(async (store) => {
|
|
209
|
+
let list = store.data[key];
|
|
210
|
+
if (list === undefined) {
|
|
211
|
+
list = [];
|
|
212
|
+
store.data[key] = list;
|
|
213
|
+
}
|
|
214
|
+
if (!Array.isArray(list))
|
|
215
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
216
|
+
const strings = elements.map(String);
|
|
217
|
+
list.push(...strings);
|
|
218
|
+
return { result: list.length, modified: true };
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
async lpop(key) {
|
|
222
|
+
return this.withLock(async (store) => {
|
|
223
|
+
const list = store.data[key];
|
|
224
|
+
if (list === undefined)
|
|
225
|
+
return { result: null, modified: false };
|
|
226
|
+
if (!Array.isArray(list))
|
|
227
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
228
|
+
const val = list.shift();
|
|
229
|
+
if (list.length === 0) {
|
|
230
|
+
delete store.data[key];
|
|
231
|
+
delete store.expiry[key];
|
|
232
|
+
}
|
|
233
|
+
return { result: val || null, modified: true };
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
async rpop(key) {
|
|
237
|
+
return this.withLock(async (store) => {
|
|
238
|
+
const list = store.data[key];
|
|
239
|
+
if (list === undefined)
|
|
240
|
+
return { result: null, modified: false };
|
|
241
|
+
if (!Array.isArray(list))
|
|
242
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
243
|
+
const val = list.pop();
|
|
244
|
+
if (list.length === 0) {
|
|
245
|
+
delete store.data[key];
|
|
246
|
+
delete store.expiry[key];
|
|
247
|
+
}
|
|
248
|
+
return { result: val || null, modified: true };
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
async hset(key, arg1, arg2) {
|
|
252
|
+
return this.withLock(async (store) => {
|
|
253
|
+
let hash = store.data[key];
|
|
254
|
+
if (hash === undefined) {
|
|
255
|
+
hash = {};
|
|
256
|
+
store.data[key] = hash;
|
|
257
|
+
}
|
|
258
|
+
if (Array.isArray(hash) || typeof hash !== 'object')
|
|
259
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
260
|
+
let count = 0;
|
|
261
|
+
if (typeof arg1 === 'string') {
|
|
262
|
+
const field = arg1;
|
|
263
|
+
const value = String(arg2);
|
|
264
|
+
if (!(field in hash))
|
|
265
|
+
count = 1;
|
|
266
|
+
hash[field] = value;
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
for (const [field, value] of Object.entries(arg1)) {
|
|
270
|
+
if (!(field in hash))
|
|
271
|
+
count++;
|
|
272
|
+
hash[field] = String(value);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return { result: count, modified: true };
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
async hget(key, field) {
|
|
279
|
+
return this.withLock(async (store) => {
|
|
280
|
+
const hash = store.data[key];
|
|
281
|
+
if (hash === undefined)
|
|
282
|
+
return { result: null, modified: false };
|
|
283
|
+
if (Array.isArray(hash) || typeof hash !== 'object')
|
|
284
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
285
|
+
const val = hash[field];
|
|
286
|
+
return { result: val !== undefined ? val : null, modified: false };
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
async hgetall(key) {
|
|
290
|
+
return this.withLock(async (store) => {
|
|
291
|
+
const hash = store.data[key];
|
|
292
|
+
if (hash === undefined)
|
|
293
|
+
return { result: {}, modified: false };
|
|
294
|
+
if (Array.isArray(hash) || typeof hash !== 'object')
|
|
295
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
296
|
+
return { result: { ...hash }, modified: false };
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
async hincrby(key, field, increment) {
|
|
300
|
+
return this.withLock(async (store) => {
|
|
301
|
+
let hash = store.data[key];
|
|
302
|
+
if (hash === undefined) {
|
|
303
|
+
hash = {};
|
|
304
|
+
store.data[key] = hash;
|
|
305
|
+
}
|
|
306
|
+
if (Array.isArray(hash) || typeof hash !== 'object')
|
|
307
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
308
|
+
const current = hash[field];
|
|
309
|
+
const val = current ? parseInt(current, 10) : 0;
|
|
310
|
+
if (isNaN(val))
|
|
311
|
+
throw new Error('hash value is not an integer');
|
|
312
|
+
const newVal = val + increment;
|
|
313
|
+
hash[field] = String(newVal);
|
|
314
|
+
return { result: newVal, modified: true };
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
async incr(key) {
|
|
318
|
+
return this.withLock(async (store) => {
|
|
319
|
+
const current = store.data[key];
|
|
320
|
+
if (current !== undefined && typeof current !== 'string')
|
|
321
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
322
|
+
const val = current ? parseInt(current, 10) : 0;
|
|
323
|
+
if (isNaN(val))
|
|
324
|
+
throw new Error('value is not an integer');
|
|
325
|
+
const newVal = val + 1;
|
|
326
|
+
store.data[key] = String(newVal);
|
|
327
|
+
return { result: newVal, modified: true };
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
async disconnect() {
|
|
331
|
+
// No persistent connection to close
|
|
332
|
+
return Promise.resolve();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
exports.FileKV = FileKV;
|
|
336
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/adapters/file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { KVClient, SetOptions } from '../types';
|
|
2
|
+
export declare class MemoryKV implements KVClient {
|
|
3
|
+
private store;
|
|
4
|
+
private timeouts;
|
|
5
|
+
get(key: string): Promise<string | null>;
|
|
6
|
+
set(key: string, value: string | number, options?: SetOptions): Promise<string | null>;
|
|
7
|
+
del(key: string): Promise<number>;
|
|
8
|
+
expire(key: string, seconds: number): Promise<number>;
|
|
9
|
+
lpush(key: string, ...elements: (string | number)[]): Promise<number>;
|
|
10
|
+
rpush(key: string, ...elements: (string | number)[]): Promise<number>;
|
|
11
|
+
lpop(key: string): Promise<string | null>;
|
|
12
|
+
rpop(key: string): Promise<string | null>;
|
|
13
|
+
hset(key: string, arg1: string | Record<string, string | number>, arg2?: string | number): Promise<number>;
|
|
14
|
+
hget(key: string, field: string): Promise<string | null>;
|
|
15
|
+
hgetall(key: string): Promise<Record<string, string>>;
|
|
16
|
+
hincrby(key: string, field: string, increment: number): Promise<number>;
|
|
17
|
+
incr(key: string): Promise<number>;
|
|
18
|
+
disconnect(): Promise<void>;
|
|
19
|
+
private setTimeout;
|
|
20
|
+
private clearTimeout;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhD,qBAAa,QAAS,YAAW,QAAQ;IACvC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAAqC;IAE/C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiBtF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMjC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOrD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAcrE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAarE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUzC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB1G,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASxD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAYrD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBvE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemoryKV = void 0;
|
|
4
|
+
class MemoryKV {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.store = new Map();
|
|
7
|
+
this.timeouts = new Map();
|
|
8
|
+
}
|
|
9
|
+
async get(key) {
|
|
10
|
+
const val = this.store.get(key);
|
|
11
|
+
if (val === undefined)
|
|
12
|
+
return null;
|
|
13
|
+
if (typeof val !== 'string' && typeof val !== 'number')
|
|
14
|
+
return null;
|
|
15
|
+
return String(val);
|
|
16
|
+
}
|
|
17
|
+
async set(key, value, options) {
|
|
18
|
+
const exists = this.store.has(key);
|
|
19
|
+
if (options?.nx && exists)
|
|
20
|
+
return null;
|
|
21
|
+
if (options?.xx && !exists)
|
|
22
|
+
return null;
|
|
23
|
+
this.clearTimeout(key);
|
|
24
|
+
this.store.set(key, String(value));
|
|
25
|
+
if (options?.ex) {
|
|
26
|
+
this.setTimeout(key, options.ex);
|
|
27
|
+
}
|
|
28
|
+
return 'OK';
|
|
29
|
+
}
|
|
30
|
+
async del(key) {
|
|
31
|
+
this.clearTimeout(key);
|
|
32
|
+
const deleted = this.store.delete(key);
|
|
33
|
+
return deleted ? 1 : 0;
|
|
34
|
+
}
|
|
35
|
+
async expire(key, seconds) {
|
|
36
|
+
if (!this.store.has(key))
|
|
37
|
+
return 0;
|
|
38
|
+
this.clearTimeout(key);
|
|
39
|
+
this.setTimeout(key, seconds);
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
async lpush(key, ...elements) {
|
|
43
|
+
let list = this.store.get(key);
|
|
44
|
+
if (list === undefined) {
|
|
45
|
+
list = [];
|
|
46
|
+
this.store.set(key, list);
|
|
47
|
+
}
|
|
48
|
+
if (!Array.isArray(list))
|
|
49
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
50
|
+
const strings = elements.map(String);
|
|
51
|
+
// lpush prepends
|
|
52
|
+
list.unshift(...strings);
|
|
53
|
+
return list.length;
|
|
54
|
+
}
|
|
55
|
+
async rpush(key, ...elements) {
|
|
56
|
+
let list = this.store.get(key);
|
|
57
|
+
if (list === undefined) {
|
|
58
|
+
list = [];
|
|
59
|
+
this.store.set(key, list);
|
|
60
|
+
}
|
|
61
|
+
if (!Array.isArray(list))
|
|
62
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
63
|
+
const strings = elements.map(String);
|
|
64
|
+
list.push(...strings);
|
|
65
|
+
return list.length;
|
|
66
|
+
}
|
|
67
|
+
async lpop(key) {
|
|
68
|
+
const list = this.store.get(key);
|
|
69
|
+
if (list === undefined)
|
|
70
|
+
return null;
|
|
71
|
+
if (!Array.isArray(list))
|
|
72
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
73
|
+
const val = list.shift();
|
|
74
|
+
if (list.length === 0)
|
|
75
|
+
this.store.delete(key);
|
|
76
|
+
return val || null;
|
|
77
|
+
}
|
|
78
|
+
async rpop(key) {
|
|
79
|
+
const list = this.store.get(key);
|
|
80
|
+
if (list === undefined)
|
|
81
|
+
return null;
|
|
82
|
+
if (!Array.isArray(list))
|
|
83
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
84
|
+
const val = list.pop();
|
|
85
|
+
if (list.length === 0)
|
|
86
|
+
this.store.delete(key);
|
|
87
|
+
return val || null;
|
|
88
|
+
}
|
|
89
|
+
async hset(key, arg1, arg2) {
|
|
90
|
+
let hash = this.store.get(key);
|
|
91
|
+
if (hash === undefined) {
|
|
92
|
+
hash = new Map();
|
|
93
|
+
this.store.set(key, hash);
|
|
94
|
+
}
|
|
95
|
+
if (!(hash instanceof Map))
|
|
96
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
97
|
+
let count = 0;
|
|
98
|
+
if (typeof arg1 === 'string') {
|
|
99
|
+
// hset(key, field, value)
|
|
100
|
+
const field = arg1;
|
|
101
|
+
const value = String(arg2);
|
|
102
|
+
if (!hash.has(field))
|
|
103
|
+
count = 1;
|
|
104
|
+
hash.set(field, value);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// hset(key, obj)
|
|
108
|
+
for (const [field, value] of Object.entries(arg1)) {
|
|
109
|
+
if (!hash.has(field))
|
|
110
|
+
count++;
|
|
111
|
+
hash.set(field, String(value));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return count;
|
|
115
|
+
}
|
|
116
|
+
async hget(key, field) {
|
|
117
|
+
const hash = this.store.get(key);
|
|
118
|
+
if (hash === undefined)
|
|
119
|
+
return null;
|
|
120
|
+
if (!(hash instanceof Map))
|
|
121
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
122
|
+
const val = hash.get(field);
|
|
123
|
+
return val !== undefined ? val : null;
|
|
124
|
+
}
|
|
125
|
+
async hgetall(key) {
|
|
126
|
+
const hash = this.store.get(key);
|
|
127
|
+
if (hash === undefined)
|
|
128
|
+
return {};
|
|
129
|
+
if (!(hash instanceof Map))
|
|
130
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
131
|
+
const result = {};
|
|
132
|
+
for (const [k, v] of hash.entries()) {
|
|
133
|
+
result[k] = v;
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
async hincrby(key, field, increment) {
|
|
138
|
+
let hash = this.store.get(key);
|
|
139
|
+
if (hash === undefined) {
|
|
140
|
+
hash = new Map();
|
|
141
|
+
this.store.set(key, hash);
|
|
142
|
+
}
|
|
143
|
+
if (!(hash instanceof Map))
|
|
144
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
145
|
+
const current = hash.get(field);
|
|
146
|
+
const val = current ? parseInt(current, 10) : 0;
|
|
147
|
+
if (isNaN(val))
|
|
148
|
+
throw new Error('hash value is not an integer');
|
|
149
|
+
const newVal = val + increment;
|
|
150
|
+
hash.set(field, String(newVal));
|
|
151
|
+
return newVal;
|
|
152
|
+
}
|
|
153
|
+
async incr(key) {
|
|
154
|
+
const current = this.store.get(key);
|
|
155
|
+
if (current !== undefined && typeof current !== 'string')
|
|
156
|
+
throw new Error('WRONGTYPE Operation against a key holding the wrong kind of value');
|
|
157
|
+
const val = current ? parseInt(current, 10) : 0;
|
|
158
|
+
if (isNaN(val))
|
|
159
|
+
throw new Error('value is not an integer');
|
|
160
|
+
const newVal = val + 1;
|
|
161
|
+
this.store.set(key, String(newVal));
|
|
162
|
+
return newVal;
|
|
163
|
+
}
|
|
164
|
+
async disconnect() {
|
|
165
|
+
for (const timeout of this.timeouts.values()) {
|
|
166
|
+
clearTimeout(timeout);
|
|
167
|
+
}
|
|
168
|
+
this.timeouts.clear();
|
|
169
|
+
this.store.clear();
|
|
170
|
+
}
|
|
171
|
+
setTimeout(key, seconds) {
|
|
172
|
+
const timeout = setTimeout(() => {
|
|
173
|
+
this.store.delete(key);
|
|
174
|
+
this.timeouts.delete(key);
|
|
175
|
+
}, seconds * 1000);
|
|
176
|
+
this.timeouts.set(key, timeout);
|
|
177
|
+
}
|
|
178
|
+
clearTimeout(key) {
|
|
179
|
+
const timeout = this.timeouts.get(key);
|
|
180
|
+
if (timeout) {
|
|
181
|
+
clearTimeout(timeout);
|
|
182
|
+
this.timeouts.delete(key);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.MemoryKV = MemoryKV;
|
|
187
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { KVClient, SetOptions, KVConfig } from '../types';
|
|
2
|
+
export declare class RedisKV implements KVClient {
|
|
3
|
+
private client;
|
|
4
|
+
constructor(config: KVConfig);
|
|
5
|
+
get(key: string): Promise<string | null>;
|
|
6
|
+
set(key: string, value: string | number, options?: SetOptions): Promise<string | null>;
|
|
7
|
+
del(key: string): Promise<number>;
|
|
8
|
+
expire(key: string, seconds: number): Promise<number>;
|
|
9
|
+
lpush(key: string, ...elements: (string | number)[]): Promise<number>;
|
|
10
|
+
rpush(key: string, ...elements: (string | number)[]): Promise<number>;
|
|
11
|
+
lpop(key: string): Promise<string | null>;
|
|
12
|
+
rpop(key: string): Promise<string | null>;
|
|
13
|
+
hset(key: string, arg1: string | Record<string, string | number>, arg2?: string | number): Promise<number>;
|
|
14
|
+
hget(key: string, field: string): Promise<string | null>;
|
|
15
|
+
hgetall(key: string): Promise<Record<string, string>>;
|
|
16
|
+
hincrby(key: string, field: string, increment: number): Promise<number>;
|
|
17
|
+
incr(key: string): Promise<number>;
|
|
18
|
+
disconnect(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/adapters/redis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE1D,qBAAa,OAAQ,YAAW,QAAQ;IACtC,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,QAAQ;IAStB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBtF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIzC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAU1G,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIrD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RedisKV = void 0;
|
|
7
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
8
|
+
class RedisKV {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
if (config.url) {
|
|
11
|
+
this.client = new ioredis_1.default(config.url);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
// Default to localhost:6379 if no URL provided, standard ioredis behavior
|
|
15
|
+
this.client = new ioredis_1.default();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async get(key) {
|
|
19
|
+
return this.client.get(key);
|
|
20
|
+
}
|
|
21
|
+
async set(key, value, options) {
|
|
22
|
+
if (options) {
|
|
23
|
+
if (options.ex && options.nx) {
|
|
24
|
+
return this.client.set(key, value, 'EX', options.ex, 'NX');
|
|
25
|
+
}
|
|
26
|
+
if (options.ex && options.xx) {
|
|
27
|
+
return this.client.set(key, value, 'EX', options.ex, 'XX');
|
|
28
|
+
}
|
|
29
|
+
if (options.ex) {
|
|
30
|
+
return this.client.set(key, value, 'EX', options.ex);
|
|
31
|
+
}
|
|
32
|
+
if (options.nx) {
|
|
33
|
+
return this.client.set(key, value, 'NX');
|
|
34
|
+
}
|
|
35
|
+
if (options.xx) {
|
|
36
|
+
return this.client.set(key, value, 'XX');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return this.client.set(key, value);
|
|
40
|
+
}
|
|
41
|
+
async del(key) {
|
|
42
|
+
return this.client.del(key);
|
|
43
|
+
}
|
|
44
|
+
async expire(key, seconds) {
|
|
45
|
+
return this.client.expire(key, seconds);
|
|
46
|
+
}
|
|
47
|
+
async lpush(key, ...elements) {
|
|
48
|
+
return this.client.lpush(key, ...elements);
|
|
49
|
+
}
|
|
50
|
+
async rpush(key, ...elements) {
|
|
51
|
+
return this.client.rpush(key, ...elements);
|
|
52
|
+
}
|
|
53
|
+
async lpop(key) {
|
|
54
|
+
return this.client.lpop(key);
|
|
55
|
+
}
|
|
56
|
+
async rpop(key) {
|
|
57
|
+
return this.client.rpop(key);
|
|
58
|
+
}
|
|
59
|
+
async hset(key, arg1, arg2) {
|
|
60
|
+
if (typeof arg1 === 'string') {
|
|
61
|
+
// arg2 is value
|
|
62
|
+
return this.client.hset(key, arg1, arg2);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// arg1 is object
|
|
66
|
+
return this.client.hset(key, arg1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async hget(key, field) {
|
|
70
|
+
return this.client.hget(key, field);
|
|
71
|
+
}
|
|
72
|
+
async hgetall(key) {
|
|
73
|
+
return this.client.hgetall(key);
|
|
74
|
+
}
|
|
75
|
+
async hincrby(key, field, increment) {
|
|
76
|
+
return this.client.hincrby(key, field, increment);
|
|
77
|
+
}
|
|
78
|
+
async incr(key) {
|
|
79
|
+
return this.client.incr(key);
|
|
80
|
+
}
|
|
81
|
+
async disconnect() {
|
|
82
|
+
await this.client.quit();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.RedisKV = RedisKV;
|
|
86
|
+
//# sourceMappingURL=redis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/adapters/redis.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { KVClient, KVConfig } from './types';
|
|
2
|
+
export * from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a new KV client instance based on configuration or environment variables.
|
|
5
|
+
*
|
|
6
|
+
* Backend selection logic:
|
|
7
|
+
* 1. `config.backend` if specified.
|
|
8
|
+
* 2. `config.url` protocol (redis://, file://, memory://).
|
|
9
|
+
* 3. Environment variables (`KV_URL`, `REDIS_URL`).
|
|
10
|
+
* 4. Defaults to `file://./terminator-kv.json` (or memory in test environment).
|
|
11
|
+
*/
|
|
12
|
+
export declare function createClient(config?: KVConfig): KVClient;
|
|
13
|
+
/**
|
|
14
|
+
* Default singleton instance auto-configured from environment.
|
|
15
|
+
*/
|
|
16
|
+
export declare const kv: KVClient;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAK7C,cAAc,SAAS,CAAC;AAExB;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,QAAa,GAAG,QAAQ,CA0B5D;AAgBD;;GAEG;AACH,eAAO,MAAM,EAAE,UAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.kv = void 0;
|
|
18
|
+
exports.createClient = createClient;
|
|
19
|
+
const redis_1 = require("./adapters/redis");
|
|
20
|
+
const file_1 = require("./adapters/file");
|
|
21
|
+
const memory_1 = require("./adapters/memory");
|
|
22
|
+
__exportStar(require("./types"), exports);
|
|
23
|
+
/**
|
|
24
|
+
* Creates a new KV client instance based on configuration or environment variables.
|
|
25
|
+
*
|
|
26
|
+
* Backend selection logic:
|
|
27
|
+
* 1. `config.backend` if specified.
|
|
28
|
+
* 2. `config.url` protocol (redis://, file://, memory://).
|
|
29
|
+
* 3. Environment variables (`KV_URL`, `REDIS_URL`).
|
|
30
|
+
* 4. Defaults to `file://./terminator-kv.json` (or memory in test environment).
|
|
31
|
+
*/
|
|
32
|
+
function createClient(config = {}) {
|
|
33
|
+
// 1. Check for explicit backend selection
|
|
34
|
+
if (config.backend === 'redis')
|
|
35
|
+
return new redis_1.RedisKV(config);
|
|
36
|
+
if (config.backend === 'file')
|
|
37
|
+
return new file_1.FileKV(config);
|
|
38
|
+
if (config.backend === 'memory')
|
|
39
|
+
return new memory_1.MemoryKV();
|
|
40
|
+
// 2. Check for URL in config
|
|
41
|
+
if (config.url) {
|
|
42
|
+
return createClientFromUrl(config.url, config);
|
|
43
|
+
}
|
|
44
|
+
// 3. Check environment variables
|
|
45
|
+
// Support standard Redis env vars
|
|
46
|
+
const envUrl = process.env.KV_URL || process.env.REDIS_URL;
|
|
47
|
+
if (envUrl) {
|
|
48
|
+
return createClientFromUrl(envUrl, config);
|
|
49
|
+
}
|
|
50
|
+
// 4. Default fallback
|
|
51
|
+
// If we are in a test environment, memory is safer/cleaner
|
|
52
|
+
if (process.env.NODE_ENV === 'test') {
|
|
53
|
+
return new memory_1.MemoryKV();
|
|
54
|
+
}
|
|
55
|
+
// Otherwise, default to file-based for local persistence "it just works"
|
|
56
|
+
return new file_1.FileKV(config);
|
|
57
|
+
}
|
|
58
|
+
function createClientFromUrl(url, config) {
|
|
59
|
+
if (url.startsWith('redis:') || url.startsWith('rediss:')) {
|
|
60
|
+
return new redis_1.RedisKV({ ...config, url });
|
|
61
|
+
}
|
|
62
|
+
if (url.startsWith('file:')) {
|
|
63
|
+
return new file_1.FileKV({ ...config, url });
|
|
64
|
+
}
|
|
65
|
+
if (url.startsWith('memory:')) {
|
|
66
|
+
return new memory_1.MemoryKV();
|
|
67
|
+
}
|
|
68
|
+
throw new Error(`[KV] Unsupported URL scheme in: ${url}`);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Default singleton instance auto-configured from environment.
|
|
72
|
+
*/
|
|
73
|
+
exports.kv = createClient();
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAgBA,oCA0BC;AAzCD,4CAA2C;AAC3C,0CAAyC;AACzC,8CAA6C;AAE7C,0CAAwB;AAExB;;;;;;;;GAQG;AACH,SAAgB,YAAY,CAAC,SAAmB,EAAE;IAChD,0CAA0C;IAC1C,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;QAAE,OAAO,IAAI,eAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,IAAI,aAAM,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,iBAAQ,EAAE,CAAC;IAEvD,6BAA6B;IAC7B,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,OAAO,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,iCAAiC;IACjC,kCAAkC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAC3D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,sBAAsB;IACtB,2DAA2D;IAC3D,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,IAAI,iBAAQ,EAAE,CAAC;IACxB,CAAC;IAED,yEAAyE;IACzE,OAAO,IAAI,aAAM,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW,EAAE,MAAgB;IACxD,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,eAAO,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,aAAM,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,iBAAQ,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACU,QAAA,EAAE,GAAG,YAAY,EAAE,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export interface SetOptions {
|
|
2
|
+
/** Expiration time in seconds */
|
|
3
|
+
ex?: number;
|
|
4
|
+
/** Only set if the key does not exist */
|
|
5
|
+
nx?: boolean;
|
|
6
|
+
/** Only set if the key already exists */
|
|
7
|
+
xx?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface KVClient {
|
|
10
|
+
/**
|
|
11
|
+
* Get the value of a key.
|
|
12
|
+
*/
|
|
13
|
+
get(key: string): Promise<string | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Set the value of a key.
|
|
16
|
+
* Returns 'OK' if successful, null if condition (nx/xx) not met.
|
|
17
|
+
*/
|
|
18
|
+
set(key: string, value: string | number, options?: SetOptions): Promise<string | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Delete a key.
|
|
21
|
+
* Returns the number of keys that were removed.
|
|
22
|
+
*/
|
|
23
|
+
del(key: string): Promise<number>;
|
|
24
|
+
/**
|
|
25
|
+
* Set a timeout on key.
|
|
26
|
+
* Returns 1 if the timeout was set, 0 if the key does not exist.
|
|
27
|
+
*/
|
|
28
|
+
expire(key: string, seconds: number): Promise<number>;
|
|
29
|
+
/**
|
|
30
|
+
* Prepend one or multiple values to a list.
|
|
31
|
+
* Returns the length of the list after the push operations.
|
|
32
|
+
*/
|
|
33
|
+
lpush(key: string, ...elements: (string | number)[]): Promise<number>;
|
|
34
|
+
/**
|
|
35
|
+
* Append one or multiple values to a list.
|
|
36
|
+
* Returns the length of the list after the push operations.
|
|
37
|
+
*/
|
|
38
|
+
rpush(key: string, ...elements: (string | number)[]): Promise<number>;
|
|
39
|
+
/**
|
|
40
|
+
* Remove and get the first element in a list.
|
|
41
|
+
*/
|
|
42
|
+
lpop(key: string): Promise<string | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Remove and get the last element in a list.
|
|
45
|
+
*/
|
|
46
|
+
rpop(key: string): Promise<string | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Set the string value of a hash field.
|
|
49
|
+
* Returns the number of fields that were added.
|
|
50
|
+
*/
|
|
51
|
+
hset(key: string, field: string, value: string | number): Promise<number>;
|
|
52
|
+
hset(key: string, obj: Record<string, string | number>): Promise<number>;
|
|
53
|
+
/**
|
|
54
|
+
* Get the value of a hash field.
|
|
55
|
+
*/
|
|
56
|
+
hget(key: string, field: string): Promise<string | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Get all the fields and values in a hash.
|
|
59
|
+
*/
|
|
60
|
+
hgetall(key: string): Promise<Record<string, string>>;
|
|
61
|
+
/**
|
|
62
|
+
* Increment the integer value of a hash field by the given number.
|
|
63
|
+
*/
|
|
64
|
+
hincrby(key: string, field: string, increment: number): Promise<number>;
|
|
65
|
+
/**
|
|
66
|
+
* Increment the integer value of a key by one.
|
|
67
|
+
*/
|
|
68
|
+
incr(key: string): Promise<number>;
|
|
69
|
+
/**
|
|
70
|
+
* Close connection.
|
|
71
|
+
*/
|
|
72
|
+
disconnect(): Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
export type KVBackendType = 'redis' | 'memory' | 'file';
|
|
75
|
+
export interface KVConfig {
|
|
76
|
+
/**
|
|
77
|
+
* Connection URL.
|
|
78
|
+
* e.g. redis://localhost:6379, file://./data.json, memory://
|
|
79
|
+
*/
|
|
80
|
+
url?: string;
|
|
81
|
+
/**
|
|
82
|
+
* Explicit backend selection if URL is generic or missing.
|
|
83
|
+
*/
|
|
84
|
+
backend?: KVBackendType;
|
|
85
|
+
/**
|
|
86
|
+
* Token for cloud-hosted Redis (e.g. Upstash/Vercel KV).
|
|
87
|
+
*/
|
|
88
|
+
token?: string;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,yCAAyC;IACzC,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEzC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvF;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAElC;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD;;;OAGG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtE;;;OAGG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtE;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1C;;;OAGG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzE;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEzD;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtD;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAExE;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnC;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mediar-ai/kv",
|
|
3
|
+
"version": "0.23.12",
|
|
4
|
+
"description": "State sharing and KV store for Terminator workflows",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md",
|
|
10
|
+
"package.json"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"dev": "tsc --watch",
|
|
15
|
+
"test": "jest"
|
|
16
|
+
},
|
|
17
|
+
"author": "Mediar AI",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/mediar-ai/terminator",
|
|
22
|
+
"directory": "packages/kv"
|
|
23
|
+
},
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"ioredis": "^5.3.2"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/jest": "^29.5.11",
|
|
32
|
+
"@types/node": "^20.11.5",
|
|
33
|
+
"jest": "^29.7.0",
|
|
34
|
+
"ts-jest": "^29.4.5",
|
|
35
|
+
"typescript": "^5.3.3"
|
|
36
|
+
}
|
|
37
|
+
}
|