@zeltjs/kv 0.8.1 → 0.8.2-canary.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.cjs +8 -0
- package/dist/adaptor-memory/index.d.cts +2 -0
- package/dist/adaptor-memory-30VRE4-j.cjs +117 -0
- package/dist/adaptor-redis/index.cjs +103 -0
- package/dist/adaptor-redis/index.d.cts +16 -0
- package/dist/adaptor-redis/index.d.cts.map +1 -0
- package/dist/index-BIhs_eQ2.d.cts +17 -0
- package/dist/index-BIhs_eQ2.d.cts.map +1 -0
- package/dist/index.cjs +28 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/kvutil.service-DhchyF5s.d.cts +59 -0
- package/dist/kvutil.service-DhchyF5s.d.cts.map +1 -0
- package/dist/util-BMIWgHNV.js.map +1 -1
- package/dist/util-MAB5bAAE.cjs +40 -0
- package/package.json +31 -12
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_adaptor_memory = require("../adaptor-memory-30VRE4-j.cjs");
|
|
3
|
+
Object.defineProperty(exports, "MemoryKVAdaptor", {
|
|
4
|
+
enumerable: true,
|
|
5
|
+
get: function() {
|
|
6
|
+
return require_adaptor_memory.MemoryKVAdaptor;
|
|
7
|
+
}
|
|
8
|
+
});
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
const require_util = require("./util-MAB5bAAE.cjs");
|
|
2
|
+
let _zeltjs_core = require("@zeltjs/core");
|
|
3
|
+
//#region src/adaptor-memory/memory-kv.adaptor.ts
|
|
4
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
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;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
}
|
|
10
|
+
function _ts_metadata(k, v) {
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
12
|
+
}
|
|
13
|
+
/** @throws {ZeltKVInvalidTtlError} */ function validateTtl(ttlSec) {
|
|
14
|
+
if (ttlSec !== void 0 && ttlSec <= 0) throw new require_util.ZeltKVInvalidTtlError({ ttlSec });
|
|
15
|
+
}
|
|
16
|
+
function makeEntry(raw, ttlSec) {
|
|
17
|
+
return ttlSec !== void 0 ? {
|
|
18
|
+
raw,
|
|
19
|
+
expiresAt: Date.now() + ttlSec * 1e3
|
|
20
|
+
} : { raw };
|
|
21
|
+
}
|
|
22
|
+
var MemoryKVAdaptor = class {
|
|
23
|
+
gc() {
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
for (const [key, entry] of this.data) if (entry.expiresAt !== void 0 && entry.expiresAt <= now) this.data.delete(key);
|
|
26
|
+
}
|
|
27
|
+
async startup() {}
|
|
28
|
+
async shutdown() {
|
|
29
|
+
clearInterval(this.gcInterval);
|
|
30
|
+
}
|
|
31
|
+
namespace(prefix) {
|
|
32
|
+
return new MemoryKVStore(this.data, prefix, this.util);
|
|
33
|
+
}
|
|
34
|
+
constructor(util = (0, _zeltjs_core.inject)(require_util.KVUtilService), lifecycle = (0, _zeltjs_core.inject)(_zeltjs_core.LifecycleManager)) {
|
|
35
|
+
this.util = util;
|
|
36
|
+
this.data = /* @__PURE__ */ new Map();
|
|
37
|
+
this.gcInterval = setInterval(() => this.gc(), 6e4);
|
|
38
|
+
this.gcInterval.unref();
|
|
39
|
+
lifecycle.register(this);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
MemoryKVAdaptor = _ts_decorate([
|
|
43
|
+
(0, _zeltjs_core.Injectable)(),
|
|
44
|
+
_ts_metadata("design:type", Function),
|
|
45
|
+
_ts_metadata("design:paramtypes", [void 0, void 0])
|
|
46
|
+
], MemoryKVAdaptor);
|
|
47
|
+
var MemoryKVStore = class MemoryKVStore {
|
|
48
|
+
k(key) {
|
|
49
|
+
return this.util.joinPrefix(this.prefix, key);
|
|
50
|
+
}
|
|
51
|
+
current(key) {
|
|
52
|
+
const entry = this.data.get(this.k(key));
|
|
53
|
+
if (!entry) return void 0;
|
|
54
|
+
if (entry.expiresAt !== void 0 && entry.expiresAt <= Date.now()) {
|
|
55
|
+
this.data.delete(this.k(key));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
return entry;
|
|
59
|
+
}
|
|
60
|
+
async get(key) {
|
|
61
|
+
const entry = this.current(key);
|
|
62
|
+
return entry ? this.util.deserialize(entry.raw) : void 0;
|
|
63
|
+
}
|
|
64
|
+
/** @throws {ZeltKVInvalidTtlError} */ async set(key, value, opts) {
|
|
65
|
+
validateTtl(opts?.ttlSec);
|
|
66
|
+
const raw = this.util.serialize(value);
|
|
67
|
+
this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));
|
|
68
|
+
}
|
|
69
|
+
async del(key) {
|
|
70
|
+
this.data.delete(this.k(key));
|
|
71
|
+
}
|
|
72
|
+
async has(key) {
|
|
73
|
+
return this.current(key) !== void 0;
|
|
74
|
+
}
|
|
75
|
+
/** @throws {ZeltKVInvalidTtlError} */ async expire(key, ttlSec) {
|
|
76
|
+
validateTtl(ttlSec);
|
|
77
|
+
const entry = this.current(key);
|
|
78
|
+
if (!entry) return false;
|
|
79
|
+
entry.expiresAt = Date.now() + ttlSec * 1e3;
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
namespace(sub) {
|
|
83
|
+
return new MemoryKVStore(this.data, this.util.joinPrefix(this.prefix, sub), this.util);
|
|
84
|
+
}
|
|
85
|
+
/** @throws {ZeltKVInvalidTtlError} */ async incr(key, by = 1, opts) {
|
|
86
|
+
validateTtl(opts?.ttlSec);
|
|
87
|
+
const k = this.k(key);
|
|
88
|
+
const entry = this.current(key);
|
|
89
|
+
if (!entry) {
|
|
90
|
+
const raw = this.util.serialize(by);
|
|
91
|
+
this.data.set(k, makeEntry(raw, opts?.ttlSec));
|
|
92
|
+
return by;
|
|
93
|
+
}
|
|
94
|
+
const next = (this.util.deserialize(entry.raw) ?? 0) + by;
|
|
95
|
+
entry.raw = this.util.serialize(next);
|
|
96
|
+
return next;
|
|
97
|
+
}
|
|
98
|
+
/** @throws {ZeltKVInvalidTtlError} */ async setnx(key, value, opts) {
|
|
99
|
+
validateTtl(opts?.ttlSec);
|
|
100
|
+
if (this.current(key)) return false;
|
|
101
|
+
const raw = this.util.serialize(value);
|
|
102
|
+
this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
constructor(data, prefix, util) {
|
|
106
|
+
this.data = data;
|
|
107
|
+
this.prefix = prefix;
|
|
108
|
+
this.util = util;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
//#endregion
|
|
112
|
+
Object.defineProperty(exports, "MemoryKVAdaptor", {
|
|
113
|
+
enumerable: true,
|
|
114
|
+
get: function() {
|
|
115
|
+
return MemoryKVAdaptor;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_util = require("../util-MAB5bAAE.cjs");
|
|
3
|
+
let _zeltjs_core = require("@zeltjs/core");
|
|
4
|
+
let _zeltjs_redis = require("@zeltjs/redis");
|
|
5
|
+
//#region src/adaptor-redis/lua-scripts.lib.ts
|
|
6
|
+
const INCR_WITH_TTL_LUA = `
|
|
7
|
+
if ARGV[2] ~= '' then
|
|
8
|
+
redis.call('SET', KEYS[1], 0, 'EX', ARGV[2], 'NX')
|
|
9
|
+
end
|
|
10
|
+
return redis.call('INCRBY', KEYS[1], ARGV[1])
|
|
11
|
+
`;
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/adaptor-redis/redis-kv-store.lib.ts
|
|
14
|
+
/** @throws {ZeltKVInvalidTtlError} */ const validateTtl = (ttlSec) => {
|
|
15
|
+
if (ttlSec !== void 0 && ttlSec <= 0) throw new require_util.ZeltKVInvalidTtlError({ ttlSec });
|
|
16
|
+
};
|
|
17
|
+
var RedisKVStore = class RedisKVStore {
|
|
18
|
+
k(key) {
|
|
19
|
+
return this.util.joinPrefix(this.prefix, key);
|
|
20
|
+
}
|
|
21
|
+
async get(key) {
|
|
22
|
+
const raw = await this.client.get(this.k(key));
|
|
23
|
+
return raw === null ? void 0 : this.util.deserialize(raw);
|
|
24
|
+
}
|
|
25
|
+
/** @throws {ZeltKVInvalidTtlError} */ async set(key, value, opts) {
|
|
26
|
+
validateTtl(opts?.ttlSec);
|
|
27
|
+
const json = this.util.serialize(value);
|
|
28
|
+
if (opts?.ttlSec !== void 0) await this.client.set(this.k(key), json, "EX", opts.ttlSec);
|
|
29
|
+
else await this.client.set(this.k(key), json);
|
|
30
|
+
}
|
|
31
|
+
async del(key) {
|
|
32
|
+
await this.client.del(this.k(key));
|
|
33
|
+
}
|
|
34
|
+
async has(key) {
|
|
35
|
+
return await this.client.exists(this.k(key)) === 1;
|
|
36
|
+
}
|
|
37
|
+
/** @throws {ZeltKVInvalidTtlError} */ async expire(key, ttlSec) {
|
|
38
|
+
validateTtl(ttlSec);
|
|
39
|
+
return await this.client.expire(this.k(key), ttlSec) === 1;
|
|
40
|
+
}
|
|
41
|
+
namespace(sub) {
|
|
42
|
+
return new RedisKVStore(this.client, this.util.joinPrefix(this.prefix, sub), this.util);
|
|
43
|
+
}
|
|
44
|
+
/** @throws {ZeltKVInvalidTtlError} */ async incr(key, by = 1, opts) {
|
|
45
|
+
validateTtl(opts?.ttlSec);
|
|
46
|
+
const ttlArg = opts?.ttlSec !== void 0 ? String(opts.ttlSec) : "";
|
|
47
|
+
return this.client.incrWithTtl(this.k(key), by, ttlArg);
|
|
48
|
+
}
|
|
49
|
+
/** @throws {ZeltKVInvalidTtlError} */ async setnx(key, value, opts) {
|
|
50
|
+
validateTtl(opts?.ttlSec);
|
|
51
|
+
const json = this.util.serialize(value);
|
|
52
|
+
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";
|
|
53
|
+
}
|
|
54
|
+
constructor(client, prefix, util) {
|
|
55
|
+
this.client = client;
|
|
56
|
+
this.prefix = prefix;
|
|
57
|
+
this.util = util;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
//#endregion
|
|
61
|
+
//#region src/adaptor-redis/redis-kv.adaptor.ts
|
|
62
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
63
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
64
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
65
|
+
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;
|
|
66
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
67
|
+
}
|
|
68
|
+
function _ts_metadata(k, v) {
|
|
69
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
70
|
+
}
|
|
71
|
+
var RedisKVAdaptor = class {
|
|
72
|
+
async startup() {
|
|
73
|
+
this.redis.client.defineCommand("incrWithTtl", {
|
|
74
|
+
numberOfKeys: 1,
|
|
75
|
+
lua: INCR_WITH_TTL_LUA
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async shutdown() {}
|
|
79
|
+
namespace(prefix) {
|
|
80
|
+
return new RedisKVStore(this.redis.client, prefix, this.util);
|
|
81
|
+
}
|
|
82
|
+
constructor(redis = (0, _zeltjs_core.inject)(_zeltjs_redis.RedisService), util = (0, _zeltjs_core.inject)(require_util.KVUtilService), lifecycle = (0, _zeltjs_core.inject)(_zeltjs_core.LifecycleManager)) {
|
|
83
|
+
this.redis = redis;
|
|
84
|
+
this.util = util;
|
|
85
|
+
lifecycle.register(this);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
RedisKVAdaptor = _ts_decorate([
|
|
89
|
+
(0, _zeltjs_core.Injectable)(),
|
|
90
|
+
_ts_metadata("design:type", Function),
|
|
91
|
+
_ts_metadata("design:paramtypes", [
|
|
92
|
+
void 0,
|
|
93
|
+
void 0,
|
|
94
|
+
void 0
|
|
95
|
+
])
|
|
96
|
+
], RedisKVAdaptor);
|
|
97
|
+
//#endregion
|
|
98
|
+
Object.defineProperty(exports, "RedisKVAdaptor", {
|
|
99
|
+
enumerable: true,
|
|
100
|
+
get: function() {
|
|
101
|
+
return RedisKVAdaptor;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { n as AtomicKVAdaptor, r as AtomicKVStore, s as NonEmptyString, t as KVUtilService } from "../kvutil.service-DhchyF5s.cjs";
|
|
2
|
+
import { Lifecycle, LifecycleManager } from "@zeltjs/core";
|
|
3
|
+
import { RedisService } from "@zeltjs/redis";
|
|
4
|
+
|
|
5
|
+
//#region src/adaptor-redis/redis-kv.adaptor.d.ts
|
|
6
|
+
declare class RedisKVAdaptor implements AtomicKVAdaptor, Lifecycle {
|
|
7
|
+
private readonly redis;
|
|
8
|
+
private readonly util;
|
|
9
|
+
constructor(redis?: RedisService, util?: KVUtilService, lifecycle?: LifecycleManager);
|
|
10
|
+
startup(): Promise<void>;
|
|
11
|
+
shutdown(): Promise<void>;
|
|
12
|
+
namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { RedisKVAdaptor };
|
|
16
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { n as AtomicKVAdaptor, r as AtomicKVStore, s as NonEmptyString, t as KVUtilService } from "./kvutil.service-DhchyF5s.cjs";
|
|
2
|
+
import { Lifecycle, LifecycleManager } from "@zeltjs/core";
|
|
3
|
+
|
|
4
|
+
//#region src/adaptor-memory/memory-kv.adaptor.d.ts
|
|
5
|
+
declare class MemoryKVAdaptor implements AtomicKVAdaptor, Lifecycle {
|
|
6
|
+
private readonly util;
|
|
7
|
+
private readonly data;
|
|
8
|
+
private readonly gcInterval;
|
|
9
|
+
constructor(util?: KVUtilService, lifecycle?: LifecycleManager);
|
|
10
|
+
private gc;
|
|
11
|
+
startup(): Promise<void>;
|
|
12
|
+
shutdown(): Promise<void>;
|
|
13
|
+
namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { MemoryKVAdaptor as t };
|
|
17
|
+
//# sourceMappingURL=index-BIhs_eQ2.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BIhs_eQ2.d.cts","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.cjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_util = require("./util-MAB5bAAE.cjs");
|
|
3
|
+
const require_adaptor_memory = require("./adaptor-memory-30VRE4-j.cjs");
|
|
4
|
+
Object.defineProperty(exports, "KVUtilService", {
|
|
5
|
+
enumerable: true,
|
|
6
|
+
get: function() {
|
|
7
|
+
return require_util.KVUtilService;
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
Object.defineProperty(exports, "MemoryKV", {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function() {
|
|
13
|
+
return require_adaptor_memory.MemoryKVAdaptor;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
Object.defineProperty(exports, "MemoryKVAdaptor", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function() {
|
|
19
|
+
return require_adaptor_memory.MemoryKVAdaptor;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
Object.defineProperty(exports, "MemoryKVService", {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
get: function() {
|
|
25
|
+
return require_adaptor_memory.MemoryKVAdaptor;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
exports.ZeltKVInvalidTtlError = require_util.ZeltKVInvalidTtlError;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
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-DhchyF5s.cjs";
|
|
2
|
+
import { t as MemoryKVAdaptor } from "./index-BIhs_eQ2.cjs";
|
|
3
|
+
|
|
4
|
+
//#region src/kv.errors.d.ts
|
|
5
|
+
declare const ZeltKVInvalidTtlError: new (context: {
|
|
6
|
+
ttlSec: number;
|
|
7
|
+
}, cause?: unknown) => Error & {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly context: {
|
|
10
|
+
ttlSec: number;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
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 };
|
|
15
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/kv.errors.ts"],"mappings":";;;;cAEa,qBAAA,OAAqB,OAAA;;uBAGjC,KAAA;EAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
//#region src/kv.types.d.ts
|
|
2
|
+
/** 空文字を型レベルで禁止 */
|
|
3
|
+
type NonEmptyString<S extends string> = S extends '' ? never : S;
|
|
4
|
+
/** undefined を除外した値型 */
|
|
5
|
+
type Defined = {} | null;
|
|
6
|
+
/** Top-level adaptor. namespace で view を取り出すまで data ops は不可。 */
|
|
7
|
+
interface KVAdaptor {
|
|
8
|
+
namespace<const S extends string>(prefix: NonEmptyString<S>): KVStore;
|
|
9
|
+
}
|
|
10
|
+
/** atomic 操作対応の adaptor。namespace の戻り値が AtomicKVStore */
|
|
11
|
+
interface AtomicKVAdaptor extends KVAdaptor {
|
|
12
|
+
namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore;
|
|
13
|
+
}
|
|
14
|
+
/** namespaced view。実際の data ops はここ */
|
|
15
|
+
interface KVStore {
|
|
16
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
17
|
+
/**
|
|
18
|
+
* @throws {ZeltKVInvalidTtlError}
|
|
19
|
+
*/
|
|
20
|
+
set<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<void>;
|
|
21
|
+
del(key: string): Promise<void>;
|
|
22
|
+
has(key: string): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* TTL 延長 (session touch / lock extend 用)。key 不在時は false。
|
|
25
|
+
* @throws {ZeltKVInvalidTtlError}
|
|
26
|
+
*/
|
|
27
|
+
expire(key: string, ttlSec: number): Promise<boolean>;
|
|
28
|
+
/** 子 namespace。チェーン可能。 */
|
|
29
|
+
namespace<const S extends string>(prefix: NonEmptyString<S>): KVStore;
|
|
30
|
+
}
|
|
31
|
+
/** atomic 操作対応 view */
|
|
32
|
+
interface AtomicKVStore extends KVStore {
|
|
33
|
+
/**
|
|
34
|
+
* atomic incr。最初の incr 時のみ TTL をセット。
|
|
35
|
+
* @throws {ZeltKVInvalidTtlError}
|
|
36
|
+
*/
|
|
37
|
+
incr(key: string, by?: number, opts?: {
|
|
38
|
+
ttlSec?: number;
|
|
39
|
+
}): Promise<number>;
|
|
40
|
+
/**
|
|
41
|
+
* atomic set if not exists。set されたら true、既存なら false。
|
|
42
|
+
* @throws {ZeltKVInvalidTtlError}
|
|
43
|
+
*/
|
|
44
|
+
setnx<T extends Defined>(key: string, value: T, opts?: SetOptions): Promise<boolean>;
|
|
45
|
+
namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore;
|
|
46
|
+
}
|
|
47
|
+
type SetOptions = {
|
|
48
|
+
ttlSec?: number;
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
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-DhchyF5s.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kvutil.service-DhchyF5s.d.cts","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"}
|
|
@@ -1 +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
|
|
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-constructor.ts","../../src/deferred-value.ts","../../src/injection-token-weak-map.ts","../../src/json.ts","../../src/keyed-values.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 isClassConstructor = <T extends object = object>(\n value: unknown,\n): value is new (\n ...args: never[]\n) => T => {\n if (typeof value !== 'function') return false;\n\n try {\n Reflect.construct(Object, [], value);\n return true;\n } catch {\n return false;\n }\n};\n","export const DEFERRED_VALUE_TYPE: unique symbol = Symbol('zelt.deferredValueType');\n\nexport type DeferredValueHandle<T> = {\n readonly [DEFERRED_VALUE_TYPE]: T;\n};\n\nexport type DeferredValueOf<THandle extends DeferredValueHandle<unknown>> =\n THandle[typeof DEFERRED_VALUE_TYPE];\n\nexport const unsafeResolveDeferredValue = <THandle extends DeferredValueHandle<unknown>>(\n handle: THandle,\n value: unknown,\n): DeferredValueOf<THandle> => {\n void handle;\n return value as DeferredValueOf<THandle>;\n};\n","import type { InjectionToken } from '@needle-di/core';\n\ntype TokenKey = new (...args: never[]) => unknown;\n\nexport class UnsafeInjectionTokenWeakMap {\n private readonly map = new WeakMap<TokenKey, InjectionToken<unknown>>();\n\n get<T>(key: TokenKey): InjectionToken<T> | undefined {\n const token = this.map.get(key);\n return token as InjectionToken<T> | undefined;\n }\n\n set<T>(key: TokenKey, token: InjectionToken<T>): void {\n this.map.set(key, token as InjectionToken<unknown>);\n }\n}\n","export const unsafeTypedJsonParse = <T>(data: string): T => JSON.parse(data) as T;\n","type KeyedItem = {\n readonly key: PropertyKey;\n};\n\nexport type KeyedMethodValue<TItem, TMethod extends PropertyKey> = TMethod extends keyof TItem\n ? TItem[TMethod] extends (...args: readonly never[]) => infer TValue\n ? Awaited<TValue>\n : never\n : never;\n\nexport type ObjectFromKeyedValues<\n TItems extends readonly KeyedItem[],\n TMethod extends PropertyKey,\n> = {\n readonly [TItem in TItems[number] as TItem['key']]: KeyedMethodValue<TItem, TMethod>;\n};\n\nexport type MapFromKeyedValues<\n TItems extends readonly KeyedItem[],\n TMethod extends PropertyKey,\n> = ReadonlyMap<TItems[number], KeyedMethodValue<TItems[number], TMethod>>;\n\nexport type KeyedValues<TItems extends readonly KeyedItem[], TMethod extends PropertyKey> = {\n readonly object: ObjectFromKeyedValues<TItems, TMethod>;\n readonly map: MapFromKeyedValues<TItems, TMethod>;\n};\n\ntype IsEmptyObject<T> = keyof T extends never ? true : false;\n\nexport type ObjectFromNonEmptyKeyedValues<\n TItems extends readonly KeyedItem[],\n TMethod extends PropertyKey,\n> = {\n readonly [TItem in TItems[number] as IsEmptyObject<KeyedMethodValue<TItem, TMethod>> extends true\n ? never\n : TItem['key']]: KeyedMethodValue<TItem, TMethod>;\n};\n\nconst isEmptyObject = (value: object): boolean => Object.keys(value).length === 0;\n\nexport const unsafeObjectFromKeyedValuesSync = <\n const TMethod extends PropertyKey,\n const TItems extends readonly (KeyedItem & {\n readonly [TKey in TMethod]: () => object;\n })[],\n>(\n items: TItems,\n method: TMethod,\n): ObjectFromKeyedValues<TItems, TMethod> => {\n const result: Record<PropertyKey, object> = {};\n\n for (const item of items) {\n result[item.key] = item[method]();\n }\n\n return result as ObjectFromKeyedValues<TItems, TMethod>;\n};\n\nexport const unsafeObjectFromNonEmptyKeyedValuesSync = <\n const TMethod extends PropertyKey,\n const TItems extends readonly (KeyedItem & {\n readonly [TKey in TMethod]: () => object;\n })[],\n>(\n items: TItems,\n method: TMethod,\n): ObjectFromNonEmptyKeyedValues<TItems, TMethod> => {\n const result: Record<PropertyKey, object> = {};\n\n for (const item of items) {\n const value = item[method]();\n if (!isEmptyObject(value)) {\n result[item.key] = value;\n }\n }\n\n return result as ObjectFromNonEmptyKeyedValues<TItems, TMethod>;\n};\n\nexport const unsafeObjectFromKeyedValues = async <\n TContext,\n const TMethod extends PropertyKey,\n const TItems extends readonly (KeyedItem & {\n readonly [TKey in TMethod]: (context: TContext) => object | Promise<object>;\n })[],\n>(\n items: TItems,\n method: TMethod,\n context: TContext,\n): Promise<ObjectFromKeyedValues<TItems, TMethod>> => {\n const result: Record<PropertyKey, object> = {};\n\n for (const item of items) {\n result[item.key] = await item[method](context);\n }\n\n return result as ObjectFromKeyedValues<TItems, TMethod>;\n};\n\nexport const unsafeKeyedValues = async <\n TContext,\n const TMethod extends PropertyKey,\n const TItems extends readonly (KeyedItem & {\n readonly [TKey in TMethod]: (context: TContext) => object | Promise<object>;\n })[],\n>(\n items: TItems,\n method: TMethod,\n context: TContext,\n): Promise<KeyedValues<TItems, TMethod>> => {\n const object: Record<PropertyKey, object> = {};\n const map = new Map<KeyedItem, object>();\n\n for (const item of items) {\n const value = await item[method](context);\n object[item.key] = value;\n map.set(item, value);\n }\n\n return {\n object: object as ObjectFromKeyedValues<TItems, TMethod>,\n map: map as unknown as MapFromKeyedValues<TItems, TMethod>,\n };\n};\n\nexport const unsafeGetKeyedValueForClass = <\n const TMethod extends PropertyKey,\n const TItems extends readonly KeyedItem[],\n const TClass extends abstract new (\n ...args: never[]\n ) => TItems[number],\n>(\n items: TItems,\n values: MapFromKeyedValues<TItems, TMethod>,\n itemClass: TClass,\n): KeyedMethodValue<InstanceType<TClass>, TMethod> | undefined => {\n const item = items.find((candidate) => candidate instanceof itemClass);\n if (!item) return undefined;\n return values.get(item) as KeyedMethodValue<InstanceType<TClass>, TMethod> | undefined;\n};\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;;;AKJtE,MAAa,wBAA2B,SAAoB,KAAK,MAAM,KAAK;;;;;;;;;AEM5E,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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
let _zeltjs_core = require("@zeltjs/core");
|
|
2
|
+
//#region src/kv.errors.ts
|
|
3
|
+
const ZeltKVInvalidTtlError = (0, require("@zeltjs/core/internal-bridge/errors").defineError)("ZeltKVInvalidTtlError", (ctx) => `ttlSec must be > 0, got ${ctx.ttlSec}`);
|
|
4
|
+
//#endregion
|
|
5
|
+
//#region ../unsafe-type-lib/dist/index.js
|
|
6
|
+
const unsafeTypedJsonParse = (data) => JSON.parse(data);
|
|
7
|
+
//#endregion
|
|
8
|
+
//#region src/util/kvutil.service.ts
|
|
9
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
10
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
12
|
+
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;
|
|
13
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
14
|
+
}
|
|
15
|
+
var KVUtilService = class {
|
|
16
|
+
joinPrefix(a, b) {
|
|
17
|
+
return a + b;
|
|
18
|
+
}
|
|
19
|
+
serialize(value) {
|
|
20
|
+
return JSON.stringify(value);
|
|
21
|
+
}
|
|
22
|
+
deserialize(raw) {
|
|
23
|
+
if (raw === null) return void 0;
|
|
24
|
+
return unsafeTypedJsonParse(raw);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
KVUtilService = _ts_decorate([(0, _zeltjs_core.Injectable)()], KVUtilService);
|
|
28
|
+
//#endregion
|
|
29
|
+
Object.defineProperty(exports, "KVUtilService", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
get: function() {
|
|
32
|
+
return KVUtilService;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(exports, "ZeltKVInvalidTtlError", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
get: function() {
|
|
38
|
+
return ZeltKVInvalidTtlError;
|
|
39
|
+
}
|
|
40
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeltjs/kv",
|
|
3
|
-
"version": "0.8.1",
|
|
3
|
+
"version": "0.8.2-canary.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -13,16 +13,34 @@
|
|
|
13
13
|
},
|
|
14
14
|
"exports": {
|
|
15
15
|
".": {
|
|
16
|
-
"
|
|
17
|
-
|
|
16
|
+
"import": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"require": {
|
|
21
|
+
"types": "./dist/index.d.cts",
|
|
22
|
+
"default": "./dist/index.cjs"
|
|
23
|
+
}
|
|
18
24
|
},
|
|
19
25
|
"./adaptor-memory": {
|
|
20
|
-
"
|
|
21
|
-
|
|
26
|
+
"import": {
|
|
27
|
+
"types": "./dist/adaptor-memory/index.d.ts",
|
|
28
|
+
"default": "./dist/adaptor-memory/index.js"
|
|
29
|
+
},
|
|
30
|
+
"require": {
|
|
31
|
+
"types": "./dist/adaptor-memory/index.d.cts",
|
|
32
|
+
"default": "./dist/adaptor-memory/index.cjs"
|
|
33
|
+
}
|
|
22
34
|
},
|
|
23
35
|
"./adaptor-redis": {
|
|
24
|
-
"
|
|
25
|
-
|
|
36
|
+
"import": {
|
|
37
|
+
"types": "./dist/adaptor-redis/index.d.ts",
|
|
38
|
+
"default": "./dist/adaptor-redis/index.js"
|
|
39
|
+
},
|
|
40
|
+
"require": {
|
|
41
|
+
"types": "./dist/adaptor-redis/index.d.cts",
|
|
42
|
+
"default": "./dist/adaptor-redis/index.cjs"
|
|
43
|
+
}
|
|
26
44
|
}
|
|
27
45
|
},
|
|
28
46
|
"files": [
|
|
@@ -30,8 +48,8 @@
|
|
|
30
48
|
],
|
|
31
49
|
"peerDependencies": {
|
|
32
50
|
"vitest": ">=4 <5",
|
|
33
|
-
"@zeltjs/core": "0.8.1",
|
|
34
|
-
"@zeltjs/redis": "0.8.1"
|
|
51
|
+
"@zeltjs/core": "0.8.2-canary.1",
|
|
52
|
+
"@zeltjs/redis": "0.8.2-canary.1"
|
|
35
53
|
},
|
|
36
54
|
"peerDependenciesMeta": {
|
|
37
55
|
"@zeltjs/redis": {
|
|
@@ -41,13 +59,14 @@
|
|
|
41
59
|
"devDependencies": {
|
|
42
60
|
"@types/node": "22.19.17",
|
|
43
61
|
"ioredis": "5.10.1",
|
|
44
|
-
"@zeltjs/core": "0.8.1",
|
|
45
|
-
"@zeltjs/
|
|
46
|
-
"@zeltjs/
|
|
62
|
+
"@zeltjs/core": "0.8.2-canary.1",
|
|
63
|
+
"@zeltjs/redis": "0.8.2-canary.1",
|
|
64
|
+
"@zeltjs/unsafe-type-lib": "0.8.2-canary.1"
|
|
47
65
|
},
|
|
48
66
|
"volta": {
|
|
49
67
|
"extends": "../../package.json"
|
|
50
68
|
},
|
|
69
|
+
"main": "./dist/index.cjs",
|
|
51
70
|
"scripts": {
|
|
52
71
|
"build": "tsdown",
|
|
53
72
|
"test": "vitest run",
|