@zeltjs/kv 0.7.0 → 0.8.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/dist/adaptor-memory/index.d.ts +1 -1
- package/dist/adaptor-memory/index.js +1 -1
- package/dist/{adaptor-memory-B0UGDGRU.js → adaptor-memory-BpDnyuqz.js} +16 -14
- package/dist/adaptor-memory-BpDnyuqz.js.map +1 -0
- package/dist/adaptor-redis/index.d.ts +8 -4
- package/dist/adaptor-redis/index.d.ts.map +1 -1
- package/dist/adaptor-redis/index.js +43 -18
- package/dist/adaptor-redis/index.js.map +1 -1
- package/dist/{index-BlASVNzQ.d.ts → index-C0Xw8ZsQ.d.ts} +4 -3
- package/dist/index-C0Xw8ZsQ.d.ts.map +1 -0
- package/dist/index.d.ts +4 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/{types-PDNBLwuJ.d.ts → kvutil.service-3_YSZSxJ.d.ts} +10 -3
- package/dist/kvutil.service-3_YSZSxJ.d.ts.map +1 -0
- package/dist/util-BMIWgHNV.js +32 -0
- package/dist/util-BMIWgHNV.js.map +1 -0
- package/package.json +6 -5
- package/dist/adaptor-memory-B0UGDGRU.js.map +0 -1
- package/dist/index-BlASVNzQ.d.ts.map +0 -1
- package/dist/serialize-DwL5y2vb.js +0 -20
- package/dist/serialize-DwL5y2vb.js.map +0 -1
- package/dist/types-PDNBLwuJ.d.ts.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as MemoryKVAdaptor } from "../index-
|
|
1
|
+
import { t as MemoryKVAdaptor } from "../index-C0Xw8ZsQ.js";
|
|
2
2
|
export { MemoryKVAdaptor };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as MemoryKVAdaptor } from "../adaptor-memory-
|
|
1
|
+
import { t as MemoryKVAdaptor } from "../adaptor-memory-BpDnyuqz.js";
|
|
2
2
|
export { MemoryKVAdaptor };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as ZeltKVInvalidTtlError, t as KVUtilService } from "./util-BMIWgHNV.js";
|
|
2
2
|
import { Injectable, LifecycleManager, inject } from "@zeltjs/core";
|
|
3
3
|
//#region src/adaptor-memory/memory-kv.adaptor.ts
|
|
4
4
|
function _ts_decorate(decorators, target, key, desc) {
|
|
@@ -29,9 +29,10 @@ var MemoryKVAdaptor = class {
|
|
|
29
29
|
clearInterval(this.gcInterval);
|
|
30
30
|
}
|
|
31
31
|
namespace(prefix) {
|
|
32
|
-
return new MemoryKVStore(this.data, prefix);
|
|
32
|
+
return new MemoryKVStore(this.data, prefix, this.util);
|
|
33
33
|
}
|
|
34
|
-
constructor(lifecycle = inject(LifecycleManager)) {
|
|
34
|
+
constructor(util = inject(KVUtilService), lifecycle = inject(LifecycleManager)) {
|
|
35
|
+
this.util = util;
|
|
35
36
|
this.data = /* @__PURE__ */ new Map();
|
|
36
37
|
this.gcInterval = setInterval(() => this.gc(), 6e4);
|
|
37
38
|
this.gcInterval.unref();
|
|
@@ -41,11 +42,11 @@ var MemoryKVAdaptor = class {
|
|
|
41
42
|
MemoryKVAdaptor = _ts_decorate([
|
|
42
43
|
Injectable(),
|
|
43
44
|
_ts_metadata("design:type", Function),
|
|
44
|
-
_ts_metadata("design:paramtypes", [void 0])
|
|
45
|
+
_ts_metadata("design:paramtypes", [void 0, void 0])
|
|
45
46
|
], MemoryKVAdaptor);
|
|
46
47
|
var MemoryKVStore = class MemoryKVStore {
|
|
47
48
|
k(key) {
|
|
48
|
-
return this.prefix
|
|
49
|
+
return this.util.joinPrefix(this.prefix, key);
|
|
49
50
|
}
|
|
50
51
|
current(key) {
|
|
51
52
|
const entry = this.data.get(this.k(key));
|
|
@@ -58,11 +59,11 @@ var MemoryKVStore = class MemoryKVStore {
|
|
|
58
59
|
}
|
|
59
60
|
async get(key) {
|
|
60
61
|
const entry = this.current(key);
|
|
61
|
-
return entry ? deserialize(entry.raw) : void 0;
|
|
62
|
+
return entry ? this.util.deserialize(entry.raw) : void 0;
|
|
62
63
|
}
|
|
63
64
|
/** @throws {ZeltKVInvalidTtlError} */ async set(key, value, opts) {
|
|
64
65
|
validateTtl(opts?.ttlSec);
|
|
65
|
-
const raw = serialize(value);
|
|
66
|
+
const raw = this.util.serialize(value);
|
|
66
67
|
this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));
|
|
67
68
|
}
|
|
68
69
|
async del(key) {
|
|
@@ -79,34 +80,35 @@ var MemoryKVStore = class MemoryKVStore {
|
|
|
79
80
|
return true;
|
|
80
81
|
}
|
|
81
82
|
namespace(sub) {
|
|
82
|
-
return new MemoryKVStore(this.data, joinPrefix(this.prefix, sub));
|
|
83
|
+
return new MemoryKVStore(this.data, this.util.joinPrefix(this.prefix, sub), this.util);
|
|
83
84
|
}
|
|
84
85
|
/** @throws {ZeltKVInvalidTtlError} */ async incr(key, by = 1, opts) {
|
|
85
86
|
validateTtl(opts?.ttlSec);
|
|
86
87
|
const k = this.k(key);
|
|
87
88
|
const entry = this.current(key);
|
|
88
89
|
if (!entry) {
|
|
89
|
-
const raw = serialize(by);
|
|
90
|
+
const raw = this.util.serialize(by);
|
|
90
91
|
this.data.set(k, makeEntry(raw, opts?.ttlSec));
|
|
91
92
|
return by;
|
|
92
93
|
}
|
|
93
|
-
const next = (deserialize(entry.raw) ?? 0) + by;
|
|
94
|
-
entry.raw = serialize(next);
|
|
94
|
+
const next = (this.util.deserialize(entry.raw) ?? 0) + by;
|
|
95
|
+
entry.raw = this.util.serialize(next);
|
|
95
96
|
return next;
|
|
96
97
|
}
|
|
97
98
|
/** @throws {ZeltKVInvalidTtlError} */ async setnx(key, value, opts) {
|
|
98
99
|
validateTtl(opts?.ttlSec);
|
|
99
100
|
if (this.current(key)) return false;
|
|
100
|
-
const raw = serialize(value);
|
|
101
|
+
const raw = this.util.serialize(value);
|
|
101
102
|
this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));
|
|
102
103
|
return true;
|
|
103
104
|
}
|
|
104
|
-
constructor(data, prefix) {
|
|
105
|
+
constructor(data, prefix, util) {
|
|
105
106
|
this.data = data;
|
|
106
107
|
this.prefix = prefix;
|
|
108
|
+
this.util = util;
|
|
107
109
|
}
|
|
108
110
|
};
|
|
109
111
|
//#endregion
|
|
110
112
|
export { MemoryKVAdaptor as t };
|
|
111
113
|
|
|
112
|
-
//# sourceMappingURL=adaptor-memory-
|
|
114
|
+
//# sourceMappingURL=adaptor-memory-BpDnyuqz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptor-memory-BpDnyuqz.js","names":["Injectable","inject","LifecycleManager","ZeltKVInvalidTtlError","KVUtilService","validateTtl","ttlSec","undefined","makeEntry","raw","expiresAt","Date","now","MemoryKVAdaptor","gc","key","entry","data","delete","startup","shutdown","clearInterval","gcInterval","namespace","prefix","MemoryKVStore","util","lifecycle","Map","setInterval","unref","register","k","joinPrefix","current","get","deserialize","set","value","opts","serialize","del","has","expire","sub","incr","by","next","setnx"],"sources":["../src/adaptor-memory/memory-kv.adaptor.ts"],"sourcesContent":["import type { Lifecycle } from '@zeltjs/core';\nimport { Injectable, inject, LifecycleManager } from '@zeltjs/core';\n\nimport { ZeltKVInvalidTtlError } from '../kv.errors';\nimport type {\n AtomicKVAdaptor,\n AtomicKVStore,\n Defined,\n NonEmptyString,\n SetOptions,\n} from '../kv.types';\nimport { KVUtilService } from '../util';\n\ntype Entry = {\n raw: string;\n /** epoch ms。undefined は永続 */\n expiresAt?: number;\n};\n\n/** @throws {ZeltKVInvalidTtlError} */\nfunction validateTtl(ttlSec: number | undefined): void {\n if (ttlSec !== undefined && ttlSec <= 0) throw new ZeltKVInvalidTtlError({ ttlSec });\n}\n\nfunction makeEntry(raw: string, ttlSec?: number): Entry {\n return ttlSec !== undefined ? { raw, expiresAt: Date.now() + ttlSec * 1000 } : { raw };\n}\n\n@Injectable()\nexport class MemoryKVAdaptor implements AtomicKVAdaptor, Lifecycle {\n private readonly data = new Map<string, Entry>();\n private readonly gcInterval: ReturnType<typeof setInterval>;\n\n constructor(\n private readonly util = inject(KVUtilService),\n lifecycle = inject(LifecycleManager),\n ) {\n this.gcInterval = setInterval(() => this.gc(), 60_000);\n this.gcInterval.unref();\n lifecycle.register(this);\n }\n\n private gc(): void {\n const now = Date.now();\n for (const [key, entry] of this.data) {\n if (entry.expiresAt !== undefined && entry.expiresAt <= now) {\n this.data.delete(key);\n }\n }\n }\n\n async startup(): Promise<void> {}\n\n async shutdown(): Promise<void> {\n clearInterval(this.gcInterval);\n }\n\n namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore {\n return new MemoryKVStore(this.data, prefix, this.util);\n }\n}\n\nclass MemoryKVStore implements AtomicKVStore {\n constructor(\n private readonly data: Map<string, Entry>,\n private readonly prefix: string,\n private readonly util: KVUtilService,\n ) {}\n\n private k(key: string): string {\n return this.util.joinPrefix(this.prefix, key);\n }\n\n private current(key: string): Entry | undefined {\n const entry = this.data.get(this.k(key));\n if (!entry) return undefined;\n if (entry.expiresAt !== undefined && entry.expiresAt <= Date.now()) {\n this.data.delete(this.k(key));\n return undefined;\n }\n return entry;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const entry = this.current(key);\n return entry ? this.util.deserialize<T>(entry.raw) : undefined;\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async set<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<void> {\n validateTtl(opts?.ttlSec);\n const raw = this.util.serialize(value);\n this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));\n }\n\n async del(key: string): Promise<void> {\n this.data.delete(this.k(key));\n }\n\n async has(key: string): Promise<boolean> {\n return this.current(key) !== undefined;\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async expire(key: string, ttlSec: number): Promise<boolean> {\n validateTtl(ttlSec);\n const entry = this.current(key);\n if (!entry) return false;\n entry.expiresAt = Date.now() + ttlSec * 1000;\n return true;\n }\n\n namespace<const S extends string>(sub: NonEmptyString<S>): AtomicKVStore {\n return new MemoryKVStore(this.data, this.util.joinPrefix(this.prefix, sub), this.util);\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async incr(key: string, by = 1, opts?: { ttlSec?: number }): Promise<number> {\n validateTtl(opts?.ttlSec);\n const k = this.k(key);\n const entry = this.current(key);\n if (!entry) {\n const raw = this.util.serialize(by);\n this.data.set(k, makeEntry(raw, opts?.ttlSec));\n return by;\n }\n const next = (this.util.deserialize<number>(entry.raw) ?? 0) + by;\n entry.raw = this.util.serialize(next);\n return next;\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async setnx<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<boolean> {\n validateTtl(opts?.ttlSec);\n if (this.current(key)) return false;\n const raw = this.util.serialize(value);\n this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));\n return true;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { n as AtomicKVStore,
|
|
1
|
+
import { n as AtomicKVAdaptor, r as AtomicKVStore, s as NonEmptyString, t as KVUtilService } from "../kvutil.service-3_YSZSxJ.js";
|
|
2
|
+
import { Lifecycle, LifecycleManager } from "@zeltjs/core";
|
|
2
3
|
import { RedisService } from "@zeltjs/redis";
|
|
3
4
|
|
|
4
|
-
//#region src/adaptor-redis/redis-kv
|
|
5
|
-
declare class RedisKVAdaptor implements AtomicKVAdaptor {
|
|
5
|
+
//#region src/adaptor-redis/redis-kv.adaptor.d.ts
|
|
6
|
+
declare class RedisKVAdaptor implements AtomicKVAdaptor, Lifecycle {
|
|
6
7
|
private readonly redis;
|
|
7
|
-
|
|
8
|
+
private readonly util;
|
|
9
|
+
constructor(redis?: RedisService, util?: KVUtilService, lifecycle?: LifecycleManager);
|
|
10
|
+
startup(): Promise<void>;
|
|
11
|
+
shutdown(): Promise<void>;
|
|
8
12
|
namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore;
|
|
9
13
|
}
|
|
10
14
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/adaptor-redis/redis-kv
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/adaptor-redis/redis-kv.adaptor.ts"],"mappings":";;;;;cAUa,cAAA,YAA0B,eAAA,EAAiB,SAAA;EAAA,iBAEnC,KAAA;EAAA,iBACA,IAAA;cADA,KAAA,GAAK,YAAA,EACL,IAAA,GAAI,aAAA,EACrB,SAAA,GAAS,gBAAA;EAKL,OAAA,CAAA,GAAW,OAAA;EAOX,QAAA,CAAA,GAAY,OAAA;EAElB,SAAA,wBAAA,CAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { inject } from "@zeltjs/core";
|
|
1
|
+
import { n as ZeltKVInvalidTtlError, t as KVUtilService } from "../util-BMIWgHNV.js";
|
|
2
|
+
import { Injectable, LifecycleManager, inject } from "@zeltjs/core";
|
|
3
3
|
import { RedisService } from "@zeltjs/redis";
|
|
4
|
-
//#region src/adaptor-redis/lua-scripts.ts
|
|
4
|
+
//#region src/adaptor-redis/lua-scripts.lib.ts
|
|
5
5
|
const INCR_WITH_TTL_LUA = `
|
|
6
6
|
if ARGV[2] ~= '' then
|
|
7
7
|
redis.call('SET', KEYS[1], 0, 'EX', ARGV[2], 'NX')
|
|
@@ -9,25 +9,21 @@ const INCR_WITH_TTL_LUA = `
|
|
|
9
9
|
return redis.call('INCRBY', KEYS[1], ARGV[1])
|
|
10
10
|
`;
|
|
11
11
|
//#endregion
|
|
12
|
-
//#region src/adaptor-redis/redis-kv-store.ts
|
|
12
|
+
//#region src/adaptor-redis/redis-kv-store.lib.ts
|
|
13
13
|
/** @throws {ZeltKVInvalidTtlError} */ const validateTtl = (ttlSec) => {
|
|
14
14
|
if (ttlSec !== void 0 && ttlSec <= 0) throw new ZeltKVInvalidTtlError({ ttlSec });
|
|
15
15
|
};
|
|
16
|
-
const incrWithTtl = async (client, key, by, ttlSec) => {
|
|
17
|
-
const ttlArg = ttlSec !== void 0 ? String(ttlSec) : "";
|
|
18
|
-
return client.eval(INCR_WITH_TTL_LUA, 1, key, by, ttlArg);
|
|
19
|
-
};
|
|
20
16
|
var RedisKVStore = class RedisKVStore {
|
|
21
17
|
k(key) {
|
|
22
|
-
return this.prefix
|
|
18
|
+
return this.util.joinPrefix(this.prefix, key);
|
|
23
19
|
}
|
|
24
20
|
async get(key) {
|
|
25
21
|
const raw = await this.client.get(this.k(key));
|
|
26
|
-
return raw === null ? void 0 : deserialize(raw);
|
|
22
|
+
return raw === null ? void 0 : this.util.deserialize(raw);
|
|
27
23
|
}
|
|
28
24
|
/** @throws {ZeltKVInvalidTtlError} */ async set(key, value, opts) {
|
|
29
25
|
validateTtl(opts?.ttlSec);
|
|
30
|
-
const json = serialize(value);
|
|
26
|
+
const json = this.util.serialize(value);
|
|
31
27
|
if (opts?.ttlSec !== void 0) await this.client.set(this.k(key), json, "EX", opts.ttlSec);
|
|
32
28
|
else await this.client.set(this.k(key), json);
|
|
33
29
|
}
|
|
@@ -42,32 +38,61 @@ var RedisKVStore = class RedisKVStore {
|
|
|
42
38
|
return await this.client.expire(this.k(key), ttlSec) === 1;
|
|
43
39
|
}
|
|
44
40
|
namespace(sub) {
|
|
45
|
-
return new RedisKVStore(this.client, joinPrefix(this.prefix, sub));
|
|
41
|
+
return new RedisKVStore(this.client, this.util.joinPrefix(this.prefix, sub), this.util);
|
|
46
42
|
}
|
|
47
43
|
/** @throws {ZeltKVInvalidTtlError} */ async incr(key, by = 1, opts) {
|
|
48
44
|
validateTtl(opts?.ttlSec);
|
|
49
|
-
|
|
45
|
+
const ttlArg = opts?.ttlSec !== void 0 ? String(opts.ttlSec) : "";
|
|
46
|
+
return this.client.incrWithTtl(this.k(key), by, ttlArg);
|
|
50
47
|
}
|
|
51
48
|
/** @throws {ZeltKVInvalidTtlError} */ async setnx(key, value, opts) {
|
|
52
49
|
validateTtl(opts?.ttlSec);
|
|
53
|
-
const json = serialize(value);
|
|
50
|
+
const json = this.util.serialize(value);
|
|
54
51
|
return (opts?.ttlSec !== void 0 ? await this.client.set(this.k(key), json, "EX", opts.ttlSec, "NX") : await this.client.set(this.k(key), json, "NX")) === "OK";
|
|
55
52
|
}
|
|
56
|
-
constructor(client, prefix) {
|
|
53
|
+
constructor(client, prefix, util) {
|
|
57
54
|
this.client = client;
|
|
58
55
|
this.prefix = prefix;
|
|
56
|
+
this.util = util;
|
|
59
57
|
}
|
|
60
58
|
};
|
|
61
59
|
//#endregion
|
|
62
|
-
//#region src/adaptor-redis/redis-kv
|
|
60
|
+
//#region src/adaptor-redis/redis-kv.adaptor.ts
|
|
61
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
62
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
63
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
64
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
65
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
66
|
+
}
|
|
67
|
+
function _ts_metadata(k, v) {
|
|
68
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
69
|
+
}
|
|
63
70
|
var RedisKVAdaptor = class {
|
|
71
|
+
async startup() {
|
|
72
|
+
this.redis.client.defineCommand("incrWithTtl", {
|
|
73
|
+
numberOfKeys: 1,
|
|
74
|
+
lua: INCR_WITH_TTL_LUA
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async shutdown() {}
|
|
64
78
|
namespace(prefix) {
|
|
65
|
-
return new RedisKVStore(this.redis.client, prefix);
|
|
79
|
+
return new RedisKVStore(this.redis.client, prefix, this.util);
|
|
66
80
|
}
|
|
67
|
-
constructor(redis = inject(RedisService)) {
|
|
81
|
+
constructor(redis = inject(RedisService), util = inject(KVUtilService), lifecycle = inject(LifecycleManager)) {
|
|
68
82
|
this.redis = redis;
|
|
83
|
+
this.util = util;
|
|
84
|
+
lifecycle.register(this);
|
|
69
85
|
}
|
|
70
86
|
};
|
|
87
|
+
RedisKVAdaptor = _ts_decorate([
|
|
88
|
+
Injectable(),
|
|
89
|
+
_ts_metadata("design:type", Function),
|
|
90
|
+
_ts_metadata("design:paramtypes", [
|
|
91
|
+
void 0,
|
|
92
|
+
void 0,
|
|
93
|
+
void 0
|
|
94
|
+
])
|
|
95
|
+
], RedisKVAdaptor);
|
|
71
96
|
//#endregion
|
|
72
97
|
export { RedisKVAdaptor };
|
|
73
98
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["INCR_WITH_TTL_LUA","ZeltKVInvalidTtlError","
|
|
1
|
+
{"version":3,"file":"index.js","names":["INCR_WITH_TTL_LUA","ZeltKVInvalidTtlError","validateTtl","ttlSec","undefined","RedisKVStore","k","key","util","joinPrefix","prefix","get","raw","client","deserialize","set","value","opts","json","serialize","del","has","n","exists","expire","namespace","sub","incr","by","ttlArg","String","incrWithTtl","setnx","result","Injectable","inject","LifecycleManager","RedisService","KVUtilService","INCR_WITH_TTL_LUA","RedisKVStore","RedisKVAdaptor","startup","redis","client","defineCommand","numberOfKeys","lua","shutdown","namespace","prefix","util","lifecycle","register"],"sources":["../../src/adaptor-redis/lua-scripts.lib.ts","../../src/adaptor-redis/redis-kv-store.lib.ts","../../src/adaptor-redis/redis-kv.adaptor.ts"],"sourcesContent":["export const INCR_WITH_TTL_LUA = `\n if ARGV[2] ~= '' then\n redis.call('SET', KEYS[1], 0, 'EX', ARGV[2], 'NX')\n end\n return redis.call('INCRBY', KEYS[1], ARGV[1])\n`;\n","import type Redis from 'ioredis';\nimport type { Result } from 'ioredis';\n\nimport { ZeltKVInvalidTtlError } from '../kv.errors';\nimport type { AtomicKVStore, Defined, NonEmptyString, SetOptions } from '../kv.types';\nimport type { KVUtilService } from '../util';\n\ndeclare module 'ioredis' {\n interface RedisCommander<Context> {\n incrWithTtl(key: string, by: number | string, ttlArg: string): Result<number, Context>;\n }\n}\n\n/** @throws {ZeltKVInvalidTtlError} */\nconst validateTtl = (ttlSec: number | undefined): void => {\n if (ttlSec !== undefined && ttlSec <= 0) throw new ZeltKVInvalidTtlError({ ttlSec });\n};\n\nexport class RedisKVStore implements AtomicKVStore {\n constructor(\n private readonly client: Redis,\n private readonly prefix: string,\n private readonly util: KVUtilService,\n ) {}\n\n private k(key: string): string {\n return this.util.joinPrefix(this.prefix, key);\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const raw = await this.client.get(this.k(key));\n return raw === null ? undefined : this.util.deserialize<T>(raw);\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async set<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<void> {\n validateTtl(opts?.ttlSec);\n const json = this.util.serialize(value);\n if (opts?.ttlSec !== undefined) {\n await this.client.set(this.k(key), json, 'EX', opts.ttlSec);\n } else {\n await this.client.set(this.k(key), json);\n }\n }\n\n async del(key: string): Promise<void> {\n await this.client.del(this.k(key));\n }\n\n async has(key: string): Promise<boolean> {\n const n = await this.client.exists(this.k(key));\n return n === 1;\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async expire(key: string, ttlSec: number): Promise<boolean> {\n validateTtl(ttlSec);\n const n = await this.client.expire(this.k(key), ttlSec);\n return n === 1;\n }\n\n namespace<const S extends string>(sub: NonEmptyString<S>): AtomicKVStore {\n return new RedisKVStore(this.client, this.util.joinPrefix(this.prefix, sub), this.util);\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async incr(key: string, by = 1, opts?: { ttlSec?: number }): Promise<number> {\n validateTtl(opts?.ttlSec);\n const ttlArg = opts?.ttlSec !== undefined ? String(opts.ttlSec) : '';\n return this.client.incrWithTtl(this.k(key), by, ttlArg);\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async setnx<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<boolean> {\n validateTtl(opts?.ttlSec);\n const json = this.util.serialize(value);\n const result =\n opts?.ttlSec !== undefined\n ? await this.client.set(this.k(key), json, 'EX', opts.ttlSec, 'NX')\n : await this.client.set(this.k(key), json, 'NX');\n return result === 'OK';\n }\n}\n","import type { Lifecycle } from '@zeltjs/core';\nimport { Injectable, inject, LifecycleManager } from '@zeltjs/core';\nimport { RedisService } from '@zeltjs/redis';\nimport type { AtomicKVAdaptor, AtomicKVStore, NonEmptyString } from '../kv.types';\nimport { KVUtilService } from '../util';\n\nimport { INCR_WITH_TTL_LUA } from './lua-scripts.lib';\nimport { RedisKVStore } from './redis-kv-store.lib';\n\n@Injectable()\nexport class RedisKVAdaptor implements AtomicKVAdaptor, Lifecycle {\n constructor(\n private readonly redis = inject(RedisService),\n private readonly util = inject(KVUtilService),\n lifecycle = inject(LifecycleManager),\n ) {\n lifecycle.register(this);\n }\n\n async startup(): Promise<void> {\n this.redis.client.defineCommand('incrWithTtl', {\n numberOfKeys: 1,\n lua: INCR_WITH_TTL_LUA,\n });\n }\n\n async shutdown(): Promise<void> {}\n\n namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore {\n return new RedisKVStore(this.redis.client, prefix, this.util);\n }\n}\n"],"mappings":";;;;AAAA,MAAaA,oBAAoB;;;;;;;;uCCcjC,MAAME,eAAeC,WAAAA;AACnB,KAAIA,WAAWC,KAAAA,KAAaD,UAAU,EAAG,OAAM,IAAIF,sBAAsB,EAAEE,QAAO,CAAA;;AAGpF,IAAaE,eAAb,MAAaA,aAAAA;CAOHC,EAAEC,KAAqB;AAC7B,SAAO,KAAKC,KAAKC,WAAW,KAAKC,QAAQH,IAAAA;;CAG3C,MAAMI,IAAOJ,KAAqC;EAChD,MAAMK,MAAM,MAAM,KAAKC,OAAOF,IAAI,KAAKL,EAAEC,IAAAA,CAAAA;AACzC,SAAOK,QAAQ,OAAOR,KAAAA,IAAY,KAAKI,KAAKM,YAAeF,IAAAA;;wCAI7D,MAAMG,IAAuBR,KAAaS,OAAUC,MAAkC;AACpFf,cAAYe,MAAMd,OAAAA;EAClB,MAAMe,OAAO,KAAKV,KAAKW,UAAUH,MAAAA;AACjC,MAAIC,MAAMd,WAAWC,KAAAA,EACnB,OAAM,KAAKS,OAAOE,IAAI,KAAKT,EAAEC,IAAAA,EAAMW,MAAM,MAAMD,KAAKd,OAAM;MAE1D,OAAM,KAAKU,OAAOE,IAAI,KAAKT,EAAEC,IAAAA,EAAMW,KAAAA;;CAIvC,MAAME,IAAIb,KAA4B;AACpC,QAAM,KAAKM,OAAOO,IAAI,KAAKd,EAAEC,IAAAA,CAAAA;;CAG/B,MAAMc,IAAId,KAA+B;AAEvC,SAAOe,MADS,KAAKT,OAAOU,OAAO,KAAKjB,EAAEC,IAAAA,CAAAA,KAC7B;;wCAIf,MAAMiB,OAAOjB,KAAaJ,QAAkC;AAC1DD,cAAYC,OAAAA;AAEZ,SAAOmB,MADS,KAAKT,OAAOW,OAAO,KAAKlB,EAAEC,IAAAA,EAAMJ,OAAAA,KACnC;;CAGfsB,UAAkCC,KAAuC;AACvE,SAAO,IAAIrB,aAAa,KAAKQ,QAAQ,KAAKL,KAAKC,WAAW,KAAKC,QAAQgB,IAAAA,EAAM,KAAKlB,KAAI;;wCAIxF,MAAMmB,KAAKpB,KAAaqB,KAAK,GAAGX,MAA6C;AAC3Ef,cAAYe,MAAMd,OAAAA;EAClB,MAAM0B,SAASZ,MAAMd,WAAWC,KAAAA,IAAY0B,OAAOb,KAAKd,OAAM,GAAI;AAClE,SAAO,KAAKU,OAAOkB,YAAY,KAAKzB,EAAEC,IAAAA,EAAMqB,IAAIC,OAAAA;;wCAIlD,MAAMG,MAAyBzB,KAAaS,OAAUC,MAAqC;AACzFf,cAAYe,MAAMd,OAAAA;EAClB,MAAMe,OAAO,KAAKV,KAAKW,UAAUH,MAAAA;AAKjC,UAHEC,MAAMd,WAAWC,KAAAA,IACb,MAAM,KAAKS,OAAOE,IAAI,KAAKT,EAAEC,IAAAA,EAAMW,MAAM,MAAMD,KAAKd,QAAQ,KAAA,GAC5D,MAAM,KAAKU,OAAOE,IAAI,KAAKT,EAAEC,IAAAA,EAAMW,MAAM,KAAA,MAC7B;;CA7DpB,YACE,QACA,QACA,MACA;OAHiBL,SAAAA;OACAH,SAAAA;OACAF,OAAAA;;;;;;;;;;;;;;ACZrB,IAAaiC,iBAAb,MAAaA;CASX,MAAMC,UAAyB;AAC7B,OAAKC,MAAMC,OAAOC,cAAc,eAAe;GAC7CC,cAAc;GACdC,KAAKR;GACP,CAAA;;CAGF,MAAMS,WAA0B;CAEhCC,UAAkCC,QAA0C;AAC1E,SAAO,IAAIV,aAAa,KAAKG,MAAMC,QAAQM,QAAQ,KAAKC,KAAI;;CAlB9D,YACE,QAAyBhB,OAAOE,aAAa,EAC7C,OAAwBF,OAAOG,cAAc,EAC7Cc,YAAYjB,OAAOC,iBAAiB,EACpC;OAHiBO,QAAAA;OACAQ,OAAAA;AAGjBC,YAAUC,SAAS,KAAI"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { n as AtomicKVStore,
|
|
1
|
+
import { n as AtomicKVAdaptor, r as AtomicKVStore, s as NonEmptyString, t as KVUtilService } from "./kvutil.service-3_YSZSxJ.js";
|
|
2
2
|
import { Lifecycle, LifecycleManager } from "@zeltjs/core";
|
|
3
3
|
|
|
4
4
|
//#region src/adaptor-memory/memory-kv.adaptor.d.ts
|
|
5
5
|
declare class MemoryKVAdaptor implements AtomicKVAdaptor, Lifecycle {
|
|
6
|
+
private readonly util;
|
|
6
7
|
private readonly data;
|
|
7
8
|
private readonly gcInterval;
|
|
8
|
-
constructor(lifecycle?: LifecycleManager);
|
|
9
|
+
constructor(util?: KVUtilService, lifecycle?: LifecycleManager);
|
|
9
10
|
private gc;
|
|
10
11
|
startup(): Promise<void>;
|
|
11
12
|
shutdown(): Promise<void>;
|
|
@@ -13,4 +14,4 @@ declare class MemoryKVAdaptor implements AtomicKVAdaptor, Lifecycle {
|
|
|
13
14
|
}
|
|
14
15
|
//#endregion
|
|
15
16
|
export { MemoryKVAdaptor as t };
|
|
16
|
-
//# sourceMappingURL=index-
|
|
17
|
+
//# sourceMappingURL=index-C0Xw8ZsQ.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-C0Xw8ZsQ.d.ts","names":[],"sources":["../src/adaptor-memory/memory-kv.adaptor.ts"],"mappings":";;;;cA6Ba,eAAA,YAA2B,eAAA,EAAiB,SAAA;EAAA,iBAKpC,IAAA;EAAA,iBAJF,IAAA;EAAA,iBACA,UAAA;cAGE,IAAA,GAAI,aAAA,EACrB,SAAA,GAAS,gBAAA;EAAA,QAOH,EAAA;EASF,OAAA,CAAA,GAAW,OAAA;EAEX,QAAA,CAAA,GAAY,OAAA;EAIlB,SAAA,wBAAA,CAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
import { t as MemoryKVAdaptor } from "./index-
|
|
1
|
+
import { a as KVAdaptor, c as SetOptions, i as Defined, n as AtomicKVAdaptor, o as KVStore, r as AtomicKVStore, s as NonEmptyString, t as KVUtilService } from "./kvutil.service-3_YSZSxJ.js";
|
|
2
|
+
import { t as MemoryKVAdaptor } from "./index-C0Xw8ZsQ.js";
|
|
3
3
|
|
|
4
|
-
//#region src/errors.d.ts
|
|
4
|
+
//#region src/kv.errors.d.ts
|
|
5
5
|
declare const ZeltKVInvalidTtlError: new (context: {
|
|
6
6
|
ttlSec: number;
|
|
7
7
|
}, cause?: unknown) => Error & {
|
|
@@ -10,14 +10,6 @@ declare const ZeltKVInvalidTtlError: new (context: {
|
|
|
10
10
|
ttlSec: number;
|
|
11
11
|
};
|
|
12
12
|
};
|
|
13
|
-
declare const isZeltKVInvalidTtlError: (err: unknown) => err is InstanceType<typeof ZeltKVInvalidTtlError>;
|
|
14
13
|
//#endregion
|
|
15
|
-
|
|
16
|
-
declare const joinPrefix: (a: string, b: string) => string;
|
|
17
|
-
//#endregion
|
|
18
|
-
//#region src/serialize.d.ts
|
|
19
|
-
declare const serialize: (value: Defined) => string;
|
|
20
|
-
declare const deserialize: <T>(raw: string | null) => T | undefined;
|
|
21
|
-
//#endregion
|
|
22
|
-
export { type AtomicKVAdaptor, type AtomicKVStore, type Defined, type KVAdaptor, type KVStore, MemoryKVAdaptor as MemoryKV, MemoryKVAdaptor, MemoryKVAdaptor as MemoryKVService, type NonEmptyString, type SetOptions, ZeltKVInvalidTtlError, deserialize, isZeltKVInvalidTtlError, joinPrefix, serialize };
|
|
14
|
+
export { type AtomicKVAdaptor, type AtomicKVStore, type Defined, type KVAdaptor, type KVStore, KVUtilService, MemoryKVAdaptor as MemoryKV, MemoryKVAdaptor, MemoryKVAdaptor as MemoryKVService, type NonEmptyString, type SetOptions, ZeltKVInvalidTtlError };
|
|
23
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/errors.ts"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/kv.errors.ts"],"mappings":";;;;cAEa,qBAAA,OAAqB,OAAA;;uBAGjC,KAAA;EAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as MemoryKVAdaptor } from "./adaptor-memory-
|
|
3
|
-
export { MemoryKVAdaptor as MemoryKV, MemoryKVAdaptor, MemoryKVAdaptor as MemoryKVService, ZeltKVInvalidTtlError
|
|
1
|
+
import { n as ZeltKVInvalidTtlError, t as KVUtilService } from "./util-BMIWgHNV.js";
|
|
2
|
+
import { t as MemoryKVAdaptor } from "./adaptor-memory-BpDnyuqz.js";
|
|
3
|
+
export { KVUtilService, MemoryKVAdaptor as MemoryKV, MemoryKVAdaptor, MemoryKVAdaptor as MemoryKVService, ZeltKVInvalidTtlError };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region src/types.d.ts
|
|
1
|
+
//#region src/kv.types.d.ts
|
|
2
2
|
/** 空文字を型レベルで禁止 */
|
|
3
3
|
type NonEmptyString<S extends string> = S extends '' ? never : S;
|
|
4
4
|
/** undefined を除外した値型 */
|
|
@@ -48,5 +48,12 @@ type SetOptions = {
|
|
|
48
48
|
ttlSec?: number;
|
|
49
49
|
};
|
|
50
50
|
//#endregion
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
//#region src/util/kvutil.service.d.ts
|
|
52
|
+
declare class KVUtilService {
|
|
53
|
+
joinPrefix(a: string, b: string): string;
|
|
54
|
+
serialize(value: Defined): string;
|
|
55
|
+
deserialize<T>(raw: string | null): T | undefined;
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { KVAdaptor as a, SetOptions as c, Defined as i, AtomicKVAdaptor as n, KVStore as o, AtomicKVStore as r, NonEmptyString as s, KVUtilService as t };
|
|
59
|
+
//# sourceMappingURL=kvutil.service-3_YSZSxJ.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kvutil.service-3_YSZSxJ.d.ts","names":[],"sources":["../src/kv.types.ts","../src/util/kvutil.service.ts"],"mappings":";;KACY,cAAA,qBAAmC,CAAA,sBAAuB,CAAA;;KAI1D,OAAA;;UAGK,SAAA;EACf,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,OAAA;AAAA;;UAI/C,eAAA,SAAwB,SAAA;EACvC,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA;;UAI/C,OAAA;EACf,GAAA,IAAO,GAAA,WAAc,OAAA,CAAQ,CAAA;EAXd;;;EAef,GAAA,WAAc,OAAA,EAAS,GAAA,UAAa,KAAA,EAAO,CAAA,EAAG,IAAA,GAAO,UAAA,GAAa,OAAA;EAClE,GAAA,CAAI,GAAA,WAAc,OAAA;EAClB,GAAA,CAAI,GAAA,WAAc,OAAA;EAhBmD;;;;EAqBrE,MAAA,CAAO,GAAA,UAAa,MAAA,WAAiB,OAAA;EArBoB;EAuBzD,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,OAAA;AAAA;;UAI/C,aAAA,SAAsB,OAAA;EAvBtB;;;;EA4Bf,IAAA,CAAK,GAAA,UAAa,EAAA,WAAa,IAAA;IAAS,MAAA;EAAA,IAAoB,OAAA;EA5BZ;;;;EAiChD,KAAA,WAAgB,OAAA,EAAS,GAAA,UAAa,KAAA,EAAO,CAAA,EAAG,IAAA,GAAO,UAAA,GAAa,OAAA;EACpE,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA;AAAA,KAGpD,UAAA;EACV,MAAA;AAAA;;;cC7CW,aAAA;EACX,UAAA,CAAW,CAAA,UAAW,CAAA;EAItB,SAAA,CAAU,KAAA,EAAO,OAAA;EAIjB,WAAA,GAAA,CAAe,GAAA,kBAAqB,CAAA;AAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Injectable } from "@zeltjs/core";
|
|
2
|
+
import { defineError } from "@zeltjs/core/internal-bridge/errors";
|
|
3
|
+
//#region src/kv.errors.ts
|
|
4
|
+
const ZeltKVInvalidTtlError = defineError("ZeltKVInvalidTtlError", (ctx) => `ttlSec must be > 0, got ${ctx.ttlSec}`);
|
|
5
|
+
//#endregion
|
|
6
|
+
//#region ../unsafe-type-lib/dist/index.js
|
|
7
|
+
const unsafeTypedJsonParse = (data) => JSON.parse(data);
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/util/kvutil.service.ts
|
|
10
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
11
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
12
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
13
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
14
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
15
|
+
}
|
|
16
|
+
var KVUtilService = class {
|
|
17
|
+
joinPrefix(a, b) {
|
|
18
|
+
return a + b;
|
|
19
|
+
}
|
|
20
|
+
serialize(value) {
|
|
21
|
+
return JSON.stringify(value);
|
|
22
|
+
}
|
|
23
|
+
deserialize(raw) {
|
|
24
|
+
if (raw === null) return void 0;
|
|
25
|
+
return unsafeTypedJsonParse(raw);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
KVUtilService = _ts_decorate([Injectable()], KVUtilService);
|
|
29
|
+
//#endregion
|
|
30
|
+
export { ZeltKVInvalidTtlError as n, KVUtilService as t };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=util-BMIWgHNV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util-BMIWgHNV.js","names":["defineError","ZeltKVInvalidTtlError","ctx","ttlSec","Injectable","unsafeTypedJsonParse","KVUtilService","joinPrefix","a","b","serialize","value","JSON","stringify","deserialize","raw","undefined"],"sources":["../src/kv.errors.ts","../../src/callable.ts","../../src/class-token.ts","../../src/json.ts","../src/util/kvutil.service.ts"],"sourcesContent":["import { defineError } from '@zeltjs/core/internal-bridge/errors';\n\nexport const ZeltKVInvalidTtlError = defineError(\n 'ZeltKVInvalidTtlError',\n (ctx: { ttlSec: number }) => `ttlSec must be > 0, got ${ctx.ttlSec}`,\n);\n","export const toUnknownCallable = (fn: unknown): ((...args: unknown[]) => unknown) =>\n fn as (...args: unknown[]) => unknown;\n","export const isClassToken = <T extends object = object>(\n value: unknown,\n): value is new (\n ...args: never[]\n) => T => typeof value === 'function' && 'prototype' in value;\n","export const unsafeTypedJsonParse = <T>(data: string): T => JSON.parse(data) as T;\n","import { Injectable } from '@zeltjs/core';\nimport { unsafeTypedJsonParse } from '@zeltjs/unsafe-type-lib';\n\nimport type { Defined } from '../kv.types';\n\n@Injectable()\nexport class KVUtilService {\n joinPrefix(a: string, b: string): string {\n return a + b;\n }\n\n serialize(value: Defined): string {\n return JSON.stringify(value);\n }\n\n deserialize<T>(raw: string | null): T | undefined {\n if (raw === null) return undefined;\n return unsafeTypedJsonParse<T>(raw);\n }\n}\n"],"mappings":";;;AAEA,MAAaC,wBAAwBD,YACnC,0BACCE,QAA4B,2BAA2BA,IAAIC,SAAQ;;;AGJtE,MAAa,wBAA2B,SAAoB,KAAK,MAAM,KAAK;;;;;;;;;ACM5E,IAAaG,gBAAb,MAAaA;CACXC,WAAWC,GAAWC,GAAmB;AACvC,SAAOD,IAAIC;;CAGbC,UAAUC,OAAwB;AAChC,SAAOC,KAAKC,UAAUF,MAAAA;;CAGxBG,YAAeC,KAAmC;AAChD,MAAIA,QAAQ,KAAM,QAAOC,KAAAA;AACzB,SAAOX,qBAAwBU,IAAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeltjs/kv",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
],
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"vitest": ">=4 <5",
|
|
33
|
-
"@zeltjs/core": "0.
|
|
34
|
-
"@zeltjs/redis": "0.
|
|
33
|
+
"@zeltjs/core": "0.8.1",
|
|
34
|
+
"@zeltjs/redis": "0.8.1"
|
|
35
35
|
},
|
|
36
36
|
"peerDependenciesMeta": {
|
|
37
37
|
"@zeltjs/redis": {
|
|
@@ -41,8 +41,9 @@
|
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/node": "22.19.17",
|
|
43
43
|
"ioredis": "5.10.1",
|
|
44
|
-
"@zeltjs/core": "0.
|
|
45
|
-
"@zeltjs/
|
|
44
|
+
"@zeltjs/core": "0.8.1",
|
|
45
|
+
"@zeltjs/unsafe-type-lib": "0.8.1",
|
|
46
|
+
"@zeltjs/redis": "0.8.1"
|
|
46
47
|
},
|
|
47
48
|
"volta": {
|
|
48
49
|
"extends": "../../package.json"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adaptor-memory-B0UGDGRU.js","names":["Injectable","inject","LifecycleManager","ZeltKVInvalidTtlError","joinPrefix","deserialize","serialize","validateTtl","ttlSec","undefined","makeEntry","raw","expiresAt","Date","now","MemoryKVAdaptor","gc","key","entry","data","delete","startup","shutdown","clearInterval","gcInterval","namespace","prefix","MemoryKVStore","lifecycle","Map","setInterval","unref","register","k","current","get","set","value","opts","del","has","expire","sub","incr","by","next","setnx"],"sources":["../src/adaptor-memory/memory-kv.adaptor.ts"],"sourcesContent":["import type { Lifecycle } from '@zeltjs/core';\nimport { Injectable, inject, LifecycleManager } from '@zeltjs/core';\n\nimport { ZeltKVInvalidTtlError } from '../errors';\nimport { joinPrefix } from '../namespace';\nimport { deserialize, serialize } from '../serialize';\nimport type { AtomicKVAdaptor, AtomicKVStore, Defined, NonEmptyString, SetOptions } from '../types';\n\ntype Entry = {\n raw: string;\n /** epoch ms。undefined は永続 */\n expiresAt?: number;\n};\n\n/** @throws {ZeltKVInvalidTtlError} */\nfunction validateTtl(ttlSec: number | undefined): void {\n if (ttlSec !== undefined && ttlSec <= 0) throw new ZeltKVInvalidTtlError({ ttlSec });\n}\n\nfunction makeEntry(raw: string, ttlSec?: number): Entry {\n return ttlSec !== undefined ? { raw, expiresAt: Date.now() + ttlSec * 1000 } : { raw };\n}\n\n@Injectable()\nexport class MemoryKVAdaptor implements AtomicKVAdaptor, Lifecycle {\n private readonly data = new Map<string, Entry>();\n private readonly gcInterval: ReturnType<typeof setInterval>;\n\n constructor(lifecycle = inject(LifecycleManager)) {\n this.gcInterval = setInterval(() => this.gc(), 60_000);\n this.gcInterval.unref();\n lifecycle.register(this);\n }\n\n private gc(): void {\n const now = Date.now();\n for (const [key, entry] of this.data) {\n if (entry.expiresAt !== undefined && entry.expiresAt <= now) {\n this.data.delete(key);\n }\n }\n }\n\n async startup(): Promise<void> {}\n\n async shutdown(): Promise<void> {\n clearInterval(this.gcInterval);\n }\n\n namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore {\n return new MemoryKVStore(this.data, prefix);\n }\n}\n\nclass MemoryKVStore implements AtomicKVStore {\n constructor(\n private readonly data: Map<string, Entry>,\n private readonly prefix: string,\n ) {}\n\n private k(key: string): string {\n return this.prefix + key;\n }\n\n private current(key: string): Entry | undefined {\n const entry = this.data.get(this.k(key));\n if (!entry) return undefined;\n if (entry.expiresAt !== undefined && entry.expiresAt <= Date.now()) {\n this.data.delete(this.k(key));\n return undefined;\n }\n return entry;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const entry = this.current(key);\n return entry ? deserialize<T>(entry.raw) : undefined;\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async set<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<void> {\n validateTtl(opts?.ttlSec);\n const raw = serialize(value);\n this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));\n }\n\n async del(key: string): Promise<void> {\n this.data.delete(this.k(key));\n }\n\n async has(key: string): Promise<boolean> {\n return this.current(key) !== undefined;\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async expire(key: string, ttlSec: number): Promise<boolean> {\n validateTtl(ttlSec);\n const entry = this.current(key);\n if (!entry) return false;\n entry.expiresAt = Date.now() + ttlSec * 1000;\n return true;\n }\n\n namespace<const S extends string>(sub: NonEmptyString<S>): AtomicKVStore {\n return new MemoryKVStore(this.data, joinPrefix(this.prefix, sub));\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async incr(key: string, by = 1, opts?: { ttlSec?: number }): Promise<number> {\n validateTtl(opts?.ttlSec);\n const k = this.k(key);\n const entry = this.current(key);\n if (!entry) {\n const raw = serialize(by);\n this.data.set(k, makeEntry(raw, opts?.ttlSec));\n return by;\n }\n const next = (deserialize<number>(entry.raw) ?? 0) + by;\n entry.raw = serialize(next);\n return next;\n }\n\n /** @throws {ZeltKVInvalidTtlError} */\n async setnx<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<boolean> {\n validateTtl(opts?.ttlSec);\n if (this.current(key)) return false;\n const raw = serialize(value);\n this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));\n return true;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BlASVNzQ.d.ts","names":[],"sources":["../src/adaptor-memory/memory-kv.adaptor.ts"],"mappings":";;;;cAwBa,eAAA,YAA2B,eAAA,EAAiB,SAAA;EAAA,iBACtC,IAAA;EAAA,iBACA,UAAA;cAEL,SAAA,GAAS,gBAAA;EAAA,QAMb,EAAA;EASF,OAAA,CAAA,GAAW,OAAA;EAEX,QAAA,CAAA,GAAY,OAAA;EAIlB,SAAA,wBAAA,CAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { defineError } from "@zeltjs/core/internal-bridge/errors";
|
|
2
|
-
//#region src/errors.ts
|
|
3
|
-
const ZeltKVInvalidTtlError = defineError("ZeltKVInvalidTtlError", (ctx) => `ttlSec must be > 0, got ${ctx.ttlSec}`);
|
|
4
|
-
const isZeltKVInvalidTtlError = (err) => {
|
|
5
|
-
return err instanceof ZeltKVInvalidTtlError;
|
|
6
|
-
};
|
|
7
|
-
//#endregion
|
|
8
|
-
//#region src/namespace.ts
|
|
9
|
-
const joinPrefix = (a, b) => a + b;
|
|
10
|
-
//#endregion
|
|
11
|
-
//#region src/serialize.ts
|
|
12
|
-
const serialize = (value) => JSON.stringify(value);
|
|
13
|
-
const deserialize = (raw) => {
|
|
14
|
-
if (raw === null) return void 0;
|
|
15
|
-
return JSON.parse(raw);
|
|
16
|
-
};
|
|
17
|
-
//#endregion
|
|
18
|
-
export { isZeltKVInvalidTtlError as a, ZeltKVInvalidTtlError as i, serialize as n, joinPrefix as r, deserialize as t };
|
|
19
|
-
|
|
20
|
-
//# sourceMappingURL=serialize-DwL5y2vb.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serialize-DwL5y2vb.js","names":["defineError","ZeltKVInvalidTtlError","ctx","ttlSec","isZeltKVInvalidTtlError","err","joinPrefix","a","b","serialize","value","JSON","stringify","deserialize","raw","undefined","parse"],"sources":["../src/errors.ts","../src/namespace.ts","../src/serialize.ts"],"sourcesContent":["import { defineError } from '@zeltjs/core/internal-bridge/errors';\n\nexport const ZeltKVInvalidTtlError = defineError(\n 'ZeltKVInvalidTtlError',\n (ctx: { ttlSec: number }) => `ttlSec must be > 0, got ${ctx.ttlSec}`,\n);\n\nexport const isZeltKVInvalidTtlError = (\n err: unknown,\n): err is InstanceType<typeof ZeltKVInvalidTtlError> => {\n return err instanceof ZeltKVInvalidTtlError;\n};\n","export const joinPrefix = (a: string, b: string): string => a + b;\n","import type { Defined } from './types';\n\nexport const serialize = (value: Defined): string => JSON.stringify(value);\n\n// deserialize stays sync without Result because we control the input (always\n// a string we previously serialized via JSON.stringify, plus driver-controlled null sentinel).\nexport const deserialize = <T>(raw: string | null): T | undefined => {\n if (raw === null) return undefined;\n return JSON.parse(raw) as T;\n};\n"],"mappings":";;AAEA,MAAaC,wBAAwBD,YACnC,0BACCE,QAA4B,2BAA2BA,IAAIC,SAAQ;AAGtE,MAAaC,2BACXC,QAAAA;AAEA,QAAOA,eAAeJ;;;;ACVxB,MAAaK,cAAcC,GAAWC,MAAsBD,IAAIC;;;ACEhE,MAAaC,aAAaC,UAA2BC,KAAKC,UAAUF,MAAAA;AAIpE,MAAaG,eAAkBC,QAAAA;AAC7B,KAAIA,QAAQ,KAAM,QAAOC,KAAAA;AACzB,QAAOJ,KAAKK,MAAMF,IAAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-PDNBLwuJ.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;KACY,cAAA,qBAAmC,CAAA,sBAAuB,CAAA;;KAI1D,OAAA;;UAGK,SAAA;EACf,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,OAAA;AAAA;;UAI/C,eAAA,SAAwB,SAAA;EACvC,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA;;UAI/C,OAAA;EACf,GAAA,IAAO,GAAA,WAAc,OAAA,CAAQ,CAAA;EAXd;;;EAef,GAAA,WAAc,OAAA,EAAS,GAAA,UAAa,KAAA,EAAO,CAAA,EAAG,IAAA,GAAO,UAAA,GAAa,OAAA;EAClE,GAAA,CAAI,GAAA,WAAc,OAAA;EAClB,GAAA,CAAI,GAAA,WAAc,OAAA;EAhBmD;;;;EAqBrE,MAAA,CAAO,GAAA,UAAa,MAAA,WAAiB,OAAA;EArBoB;EAuBzD,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,OAAA;AAAA;;UAI/C,aAAA,SAAsB,OAAA;EAvBtB;;;;EA4Bf,IAAA,CAAK,GAAA,UAAa,EAAA,WAAa,IAAA;IAAS,MAAA;EAAA,IAAoB,OAAA;EA5BZ;;;;EAiChD,KAAA,WAAgB,OAAA,EAAS,GAAA,UAAa,KAAA,EAAO,CAAA,EAAG,IAAA,GAAO,UAAA,GAAa,OAAA;EACpE,SAAA,yBAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA;AAAA,KAGpD,UAAA;EACV,MAAA;AAAA"}
|