@zeltjs/kv 0.6.0 → 0.7.0

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.
@@ -1,2 +1,2 @@
1
- import { t as MemoryKVAdaptor } from "../adaptor-memory-BcPJjrIS.js";
1
+ import { t as MemoryKVAdaptor } from "../adaptor-memory-B0UGDGRU.js";
2
2
  export { MemoryKVAdaptor };
@@ -1,8 +1,16 @@
1
1
  import { i as ZeltKVInvalidTtlError, n as serialize, r as joinPrefix, t as deserialize } from "./serialize-DwL5y2vb.js";
2
2
  import { Injectable, LifecycleManager, inject } from "@zeltjs/core";
3
3
  //#region src/adaptor-memory/memory-kv.adaptor.ts
4
- /** @throws {ZeltKVInvalidTtlError} */
5
- function validateTtl(ttlSec) {
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) {
6
14
  if (ttlSec !== void 0 && ttlSec <= 0) throw new ZeltKVInvalidTtlError({ ttlSec });
7
15
  }
8
16
  function makeEntry(raw, ttlSec) {
@@ -11,13 +19,7 @@ function makeEntry(raw, ttlSec) {
11
19
  expiresAt: Date.now() + ttlSec * 1e3
12
20
  } : { raw };
13
21
  }
14
- var MemoryKVAdaptor = @Injectable() class {
15
- constructor(lifecycle = inject(LifecycleManager)) {
16
- this.data = /* @__PURE__ */ new Map();
17
- this.gcInterval = setInterval(() => this.gc(), 6e4);
18
- this.gcInterval.unref();
19
- lifecycle.register(this);
20
- }
22
+ var MemoryKVAdaptor = class {
21
23
  gc() {
22
24
  const now = Date.now();
23
25
  for (const [key, entry] of this.data) if (entry.expiresAt !== void 0 && entry.expiresAt <= now) this.data.delete(key);
@@ -29,12 +31,19 @@ var MemoryKVAdaptor = @Injectable() class {
29
31
  namespace(prefix) {
30
32
  return new MemoryKVStore(this.data, prefix);
31
33
  }
34
+ constructor(lifecycle = inject(LifecycleManager)) {
35
+ this.data = /* @__PURE__ */ new Map();
36
+ this.gcInterval = setInterval(() => this.gc(), 6e4);
37
+ this.gcInterval.unref();
38
+ lifecycle.register(this);
39
+ }
32
40
  };
41
+ MemoryKVAdaptor = _ts_decorate([
42
+ Injectable(),
43
+ _ts_metadata("design:type", Function),
44
+ _ts_metadata("design:paramtypes", [void 0])
45
+ ], MemoryKVAdaptor);
33
46
  var MemoryKVStore = class MemoryKVStore {
34
- constructor(data, prefix) {
35
- this.data = data;
36
- this.prefix = prefix;
37
- }
38
47
  k(key) {
39
48
  return this.prefix + key;
40
49
  }
@@ -51,8 +60,7 @@ var MemoryKVStore = class MemoryKVStore {
51
60
  const entry = this.current(key);
52
61
  return entry ? deserialize(entry.raw) : void 0;
53
62
  }
54
- /** @throws {ZeltKVInvalidTtlError} */
55
- async set(key, value, opts) {
63
+ /** @throws {ZeltKVInvalidTtlError} */ async set(key, value, opts) {
56
64
  validateTtl(opts?.ttlSec);
57
65
  const raw = serialize(value);
58
66
  this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));
@@ -63,8 +71,7 @@ var MemoryKVStore = class MemoryKVStore {
63
71
  async has(key) {
64
72
  return this.current(key) !== void 0;
65
73
  }
66
- /** @throws {ZeltKVInvalidTtlError} */
67
- async expire(key, ttlSec) {
74
+ /** @throws {ZeltKVInvalidTtlError} */ async expire(key, ttlSec) {
68
75
  validateTtl(ttlSec);
69
76
  const entry = this.current(key);
70
77
  if (!entry) return false;
@@ -74,8 +81,7 @@ var MemoryKVStore = class MemoryKVStore {
74
81
  namespace(sub) {
75
82
  return new MemoryKVStore(this.data, joinPrefix(this.prefix, sub));
76
83
  }
77
- /** @throws {ZeltKVInvalidTtlError} */
78
- async incr(key, by = 1, opts) {
84
+ /** @throws {ZeltKVInvalidTtlError} */ async incr(key, by = 1, opts) {
79
85
  validateTtl(opts?.ttlSec);
80
86
  const k = this.k(key);
81
87
  const entry = this.current(key);
@@ -88,16 +94,19 @@ var MemoryKVStore = class MemoryKVStore {
88
94
  entry.raw = serialize(next);
89
95
  return next;
90
96
  }
91
- /** @throws {ZeltKVInvalidTtlError} */
92
- async setnx(key, value, opts) {
97
+ /** @throws {ZeltKVInvalidTtlError} */ async setnx(key, value, opts) {
93
98
  validateTtl(opts?.ttlSec);
94
99
  if (this.current(key)) return false;
95
100
  const raw = serialize(value);
96
101
  this.data.set(this.k(key), makeEntry(raw, opts?.ttlSec));
97
102
  return true;
98
103
  }
104
+ constructor(data, prefix) {
105
+ this.data = data;
106
+ this.prefix = prefix;
107
+ }
99
108
  };
100
109
  //#endregion
101
110
  export { MemoryKVAdaptor as t };
102
111
 
103
- //# sourceMappingURL=adaptor-memory-BcPJjrIS.js.map
112
+ //# sourceMappingURL=adaptor-memory-B0UGDGRU.js.map
@@ -0,0 +1 @@
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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"}
@@ -10,8 +10,7 @@ const INCR_WITH_TTL_LUA = `
10
10
  `;
11
11
  //#endregion
12
12
  //#region src/adaptor-redis/redis-kv-store.ts
13
- /** @throws {ZeltKVInvalidTtlError} */
14
- const validateTtl = (ttlSec) => {
13
+ /** @throws {ZeltKVInvalidTtlError} */ const validateTtl = (ttlSec) => {
15
14
  if (ttlSec !== void 0 && ttlSec <= 0) throw new ZeltKVInvalidTtlError({ ttlSec });
16
15
  };
17
16
  const incrWithTtl = async (client, key, by, ttlSec) => {
@@ -19,10 +18,6 @@ const incrWithTtl = async (client, key, by, ttlSec) => {
19
18
  return client.eval(INCR_WITH_TTL_LUA, 1, key, by, ttlArg);
20
19
  };
21
20
  var RedisKVStore = class RedisKVStore {
22
- constructor(client, prefix) {
23
- this.client = client;
24
- this.prefix = prefix;
25
- }
26
21
  k(key) {
27
22
  return this.prefix + key;
28
23
  }
@@ -30,8 +25,7 @@ var RedisKVStore = class RedisKVStore {
30
25
  const raw = await this.client.get(this.k(key));
31
26
  return raw === null ? void 0 : deserialize(raw);
32
27
  }
33
- /** @throws {ZeltKVInvalidTtlError} */
34
- async set(key, value, opts) {
28
+ /** @throws {ZeltKVInvalidTtlError} */ async set(key, value, opts) {
35
29
  validateTtl(opts?.ttlSec);
36
30
  const json = serialize(value);
37
31
  if (opts?.ttlSec !== void 0) await this.client.set(this.k(key), json, "EX", opts.ttlSec);
@@ -43,35 +37,36 @@ var RedisKVStore = class RedisKVStore {
43
37
  async has(key) {
44
38
  return await this.client.exists(this.k(key)) === 1;
45
39
  }
46
- /** @throws {ZeltKVInvalidTtlError} */
47
- async expire(key, ttlSec) {
40
+ /** @throws {ZeltKVInvalidTtlError} */ async expire(key, ttlSec) {
48
41
  validateTtl(ttlSec);
49
42
  return await this.client.expire(this.k(key), ttlSec) === 1;
50
43
  }
51
44
  namespace(sub) {
52
45
  return new RedisKVStore(this.client, joinPrefix(this.prefix, sub));
53
46
  }
54
- /** @throws {ZeltKVInvalidTtlError} */
55
- async incr(key, by = 1, opts) {
47
+ /** @throws {ZeltKVInvalidTtlError} */ async incr(key, by = 1, opts) {
56
48
  validateTtl(opts?.ttlSec);
57
49
  return incrWithTtl(this.client, this.k(key), by, opts?.ttlSec);
58
50
  }
59
- /** @throws {ZeltKVInvalidTtlError} */
60
- async setnx(key, value, opts) {
51
+ /** @throws {ZeltKVInvalidTtlError} */ async setnx(key, value, opts) {
61
52
  validateTtl(opts?.ttlSec);
62
53
  const json = serialize(value);
63
54
  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";
64
55
  }
56
+ constructor(client, prefix) {
57
+ this.client = client;
58
+ this.prefix = prefix;
59
+ }
65
60
  };
66
61
  //#endregion
67
62
  //#region src/adaptor-redis/redis-kv-adaptor.ts
68
63
  var RedisKVAdaptor = class {
69
- constructor(redis = inject(RedisService)) {
70
- this.redis = redis;
71
- }
72
64
  namespace(prefix) {
73
65
  return new RedisKVStore(this.redis.client, prefix);
74
66
  }
67
+ constructor(redis = inject(RedisService)) {
68
+ this.redis = redis;
69
+ }
75
70
  };
76
71
  //#endregion
77
72
  export { RedisKVAdaptor };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/adaptor-redis/lua-scripts.ts","../../src/adaptor-redis/redis-kv-store.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 { ZeltKVInvalidTtlError } from '../errors';\nimport { joinPrefix } from '../namespace';\nimport { deserialize, serialize } from '../serialize';\nimport type { AtomicKVStore, Defined, NonEmptyString, SetOptions } from '../types';\n\nimport { INCR_WITH_TTL_LUA } from './lua-scripts';\n\n/** @throws {ZeltKVInvalidTtlError} */\nconst validateTtl = (ttlSec: number | undefined): void => {\n if (ttlSec !== undefined && ttlSec <= 0) throw new ZeltKVInvalidTtlError({ ttlSec });\n};\n\nconst incrWithTtl = async (\n client: Redis,\n key: string,\n by: number,\n ttlSec: number | undefined,\n): Promise<number> => {\n const ttlArg = ttlSec !== undefined ? String(ttlSec) : '';\n return client.eval(INCR_WITH_TTL_LUA, 1, key, by, ttlArg) as Promise<number>;\n};\n\nexport class RedisKVStore implements AtomicKVStore {\n constructor(\n private readonly client: Redis,\n private readonly prefix: string,\n ) {}\n\n private k(key: string): string {\n return 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 : 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 = 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, 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 return incrWithTtl(this.client, this.k(key), by, opts?.ttlSec);\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 = 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 { inject } from '@zeltjs/core';\nimport { RedisService } from '@zeltjs/redis';\n\nimport type { AtomicKVAdaptor, AtomicKVStore, NonEmptyString } from '../types';\n\nimport { RedisKVStore } from './redis-kv-store';\n\nexport class RedisKVAdaptor implements AtomicKVAdaptor {\n constructor(private readonly redis = inject(RedisService)) {}\n\n namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore {\n return new RedisKVStore(this.redis.client, prefix);\n }\n}\n"],"mappings":";;;;AAAA,MAAa,oBAAoB;;;;;;;;;ACSjC,MAAM,eAAe,WAAqC;AACxD,KAAI,WAAW,KAAA,KAAa,UAAU,EAAG,OAAM,IAAI,sBAAsB,EAAE,QAAQ,CAAC;;AAGtF,MAAM,cAAc,OAClB,QACA,KACA,IACA,WACoB;CACpB,MAAM,SAAS,WAAW,KAAA,IAAY,OAAO,OAAO,GAAG;AACvD,QAAO,OAAO,KAAK,mBAAmB,GAAG,KAAK,IAAI,OAAO;;AAG3D,IAAa,eAAb,MAAa,aAAsC;CACjD,YACE,QACA,QACA;AAFiB,OAAA,SAAA;AACA,OAAA,SAAA;;CAGnB,EAAU,KAAqB;AAC7B,SAAO,KAAK,SAAS;;CAGvB,MAAM,IAAO,KAAqC;EAChD,MAAM,MAAM,MAAM,KAAK,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC;AAC9C,SAAO,QAAQ,OAAO,KAAA,IAAY,YAAe,IAAI;;;CAIvD,MAAM,IAAuB,KAAa,OAAU,MAAkC;AACpF,cAAY,MAAM,OAAO;EACzB,MAAM,OAAO,UAAU,MAAM;AAC7B,MAAI,MAAM,WAAW,KAAA,EACnB,OAAM,KAAK,OAAO,IAAI,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,KAAK,OAAO;MAE3D,OAAM,KAAK,OAAO,IAAI,KAAK,EAAE,IAAI,EAAE,KAAK;;CAI5C,MAAM,IAAI,KAA4B;AACpC,QAAM,KAAK,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC;;CAGpC,MAAM,IAAI,KAA+B;AAEvC,SAAO,MADS,KAAK,OAAO,OAAO,KAAK,EAAE,IAAI,CAAC,KAClC;;;CAIf,MAAM,OAAO,KAAa,QAAkC;AAC1D,cAAY,OAAO;AAEnB,SAAO,MADS,KAAK,OAAO,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,KAC1C;;CAGf,UAAkC,KAAuC;AACvE,SAAO,IAAI,aAAa,KAAK,QAAQ,WAAW,KAAK,QAAQ,IAAI,CAAC;;;CAIpE,MAAM,KAAK,KAAa,KAAK,GAAG,MAA6C;AAC3E,cAAY,MAAM,OAAO;AACzB,SAAO,YAAY,KAAK,QAAQ,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,OAAO;;;CAIhE,MAAM,MAAyB,KAAa,OAAU,MAAqC;AACzF,cAAY,MAAM,OAAO;EACzB,MAAM,OAAO,UAAU,MAAM;AAK7B,UAHE,MAAM,WAAW,KAAA,IACb,MAAM,KAAK,OAAO,IAAI,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,KAAK,QAAQ,KAAK,GACjE,MAAM,KAAK,OAAO,IAAI,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,MAClC;;;;;AC5EtB,IAAa,iBAAb,MAAuD;CACrD,YAAY,QAAyB,OAAO,aAAa,EAAE;AAA9B,OAAA,QAAA;;CAE7B,UAAkC,QAA0C;AAC1E,SAAO,IAAI,aAAa,KAAK,MAAM,QAAQ,OAAO"}
1
+ {"version":3,"file":"index.js","names":["INCR_WITH_TTL_LUA","ZeltKVInvalidTtlError","joinPrefix","deserialize","serialize","INCR_WITH_TTL_LUA","validateTtl","ttlSec","undefined","incrWithTtl","client","key","by","ttlArg","String","eval","RedisKVStore","k","prefix","get","raw","set","value","opts","json","del","has","n","exists","expire","namespace","sub","incr","setnx","result","inject","RedisService","RedisKVStore","RedisKVAdaptor","namespace","prefix","redis","client"],"sources":["../../src/adaptor-redis/lua-scripts.ts","../../src/adaptor-redis/redis-kv-store.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 { ZeltKVInvalidTtlError } from '../errors';\nimport { joinPrefix } from '../namespace';\nimport { deserialize, serialize } from '../serialize';\nimport type { AtomicKVStore, Defined, NonEmptyString, SetOptions } from '../types';\n\nimport { INCR_WITH_TTL_LUA } from './lua-scripts';\n\n/** @throws {ZeltKVInvalidTtlError} */\nconst validateTtl = (ttlSec: number | undefined): void => {\n if (ttlSec !== undefined && ttlSec <= 0) throw new ZeltKVInvalidTtlError({ ttlSec });\n};\n\nconst incrWithTtl = async (\n client: Redis,\n key: string,\n by: number,\n ttlSec: number | undefined,\n): Promise<number> => {\n const ttlArg = ttlSec !== undefined ? String(ttlSec) : '';\n return client.eval(INCR_WITH_TTL_LUA, 1, key, by, ttlArg) as Promise<number>;\n};\n\nexport class RedisKVStore implements AtomicKVStore {\n constructor(\n private readonly client: Redis,\n private readonly prefix: string,\n ) {}\n\n private k(key: string): string {\n return 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 : 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 = 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, 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 return incrWithTtl(this.client, this.k(key), by, opts?.ttlSec);\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 = 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 { inject } from '@zeltjs/core';\nimport { RedisService } from '@zeltjs/redis';\n\nimport type { AtomicKVAdaptor, AtomicKVStore, NonEmptyString } from '../types';\n\nimport { RedisKVStore } from './redis-kv-store';\n\nexport class RedisKVAdaptor implements AtomicKVAdaptor {\n constructor(private readonly redis = inject(RedisService)) {}\n\n namespace<const S extends string>(prefix: NonEmptyString<S>): AtomicKVStore {\n return new RedisKVStore(this.redis.client, prefix);\n }\n}\n"],"mappings":";;;;AAAA,MAAaA,oBAAoB;;;;;;;;uCCSjC,MAAMM,eAAeC,WAAAA;AACnB,KAAIA,WAAWC,KAAAA,KAAaD,UAAU,EAAG,OAAM,IAAIN,sBAAsB,EAAEM,QAAO,CAAA;;AAGpF,MAAME,cAAc,OAClBC,QACAC,KACAC,IACAL,WAAAA;CAEA,MAAMM,SAASN,WAAWC,KAAAA,IAAYM,OAAOP,OAAAA,GAAU;AACvD,QAAOG,OAAOK,KAAKV,mBAAmB,GAAGM,KAAKC,IAAIC,OAAAA;;AAGpD,IAAaG,eAAb,MAAaA,aAAAA;CAMHC,EAAEN,KAAqB;AAC7B,SAAO,KAAKO,SAASP;;CAGvB,MAAMQ,IAAOR,KAAqC;EAChD,MAAMS,MAAM,MAAM,KAAKV,OAAOS,IAAI,KAAKF,EAAEN,IAAAA,CAAAA;AACzC,SAAOS,QAAQ,OAAOZ,KAAAA,IAAYL,YAAeiB,IAAAA;;wCAInD,MAAMC,IAAuBV,KAAaW,OAAUC,MAAkC;AACpFjB,cAAYiB,MAAMhB,OAAAA;EAClB,MAAMiB,OAAOpB,UAAUkB,MAAAA;AACvB,MAAIC,MAAMhB,WAAWC,KAAAA,EACnB,OAAM,KAAKE,OAAOW,IAAI,KAAKJ,EAAEN,IAAAA,EAAMa,MAAM,MAAMD,KAAKhB,OAAM;MAE1D,OAAM,KAAKG,OAAOW,IAAI,KAAKJ,EAAEN,IAAAA,EAAMa,KAAAA;;CAIvC,MAAMC,IAAId,KAA4B;AACpC,QAAM,KAAKD,OAAOe,IAAI,KAAKR,EAAEN,IAAAA,CAAAA;;CAG/B,MAAMe,IAAIf,KAA+B;AAEvC,SAAOgB,MADS,KAAKjB,OAAOkB,OAAO,KAAKX,EAAEN,IAAAA,CAAAA,KAC7B;;wCAIf,MAAMkB,OAAOlB,KAAaJ,QAAkC;AAC1DD,cAAYC,OAAAA;AAEZ,SAAOoB,MADS,KAAKjB,OAAOmB,OAAO,KAAKZ,EAAEN,IAAAA,EAAMJ,OAAAA,KACnC;;CAGfuB,UAAkCC,KAAuC;AACvE,SAAO,IAAIf,aAAa,KAAKN,QAAQR,WAAW,KAAKgB,QAAQa,IAAAA,CAAAA;;wCAI/D,MAAMC,KAAKrB,KAAaC,KAAK,GAAGW,MAA6C;AAC3EjB,cAAYiB,MAAMhB,OAAAA;AAClB,SAAOE,YAAY,KAAKC,QAAQ,KAAKO,EAAEN,IAAAA,EAAMC,IAAIW,MAAMhB,OAAAA;;wCAIzD,MAAM0B,MAAyBtB,KAAaW,OAAUC,MAAqC;AACzFjB,cAAYiB,MAAMhB,OAAAA;EAClB,MAAMiB,OAAOpB,UAAUkB,MAAAA;AAKvB,UAHEC,MAAMhB,WAAWC,KAAAA,IACb,MAAM,KAAKE,OAAOW,IAAI,KAAKJ,EAAEN,IAAAA,EAAMa,MAAM,MAAMD,KAAKhB,QAAQ,KAAA,GAC5D,MAAM,KAAKG,OAAOW,IAAI,KAAKJ,EAAEN,IAAAA,EAAMa,MAAM,KAAA,MAC7B;;CA3DpB,YACE,QACA,QACA;OAFiBd,SAAAA;OACAQ,SAAAA;;;;;ACnBrB,IAAaoB,iBAAb,MAAaA;CAGXC,UAAkCC,QAA0C;AAC1E,SAAO,IAAIH,aAAa,KAAKI,MAAMC,QAAQF,OAAAA;;CAH7C,YAAY,QAAyBL,OAAOC,aAAa,EAAE;OAA9BK,QAAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import { a as isZeltKVInvalidTtlError, i as ZeltKVInvalidTtlError, n as serialize, r as joinPrefix, t as deserialize } from "./serialize-DwL5y2vb.js";
2
- import { t as MemoryKVAdaptor } from "./adaptor-memory-BcPJjrIS.js";
2
+ import { t as MemoryKVAdaptor } from "./adaptor-memory-B0UGDGRU.js";
3
3
  export { MemoryKVAdaptor as MemoryKV, MemoryKVAdaptor, MemoryKVAdaptor as MemoryKVService, ZeltKVInvalidTtlError, deserialize, isZeltKVInvalidTtlError, joinPrefix, serialize };
@@ -1 +1 @@
1
- {"version":3,"file":"serialize-DwL5y2vb.js","names":[],"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,MAAa,wBAAwB,YACnC,0BACC,QAA4B,2BAA2B,IAAI,SAC7D;AAED,MAAa,2BACX,QACsD;AACtD,QAAO,eAAe;;;;ACVxB,MAAa,cAAc,GAAW,MAAsB,IAAI;;;ACEhE,MAAa,aAAa,UAA2B,KAAK,UAAU,MAAM;AAI1E,MAAa,eAAkB,QAAsC;AACnE,KAAI,QAAQ,KAAM,QAAO,KAAA;AACzB,QAAO,KAAK,MAAM,IAAI"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeltjs/kv",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
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/redis": "0.6.0",
34
- "@zeltjs/core": "0.6.0"
33
+ "@zeltjs/core": "0.7.0",
34
+ "@zeltjs/redis": "0.7.0"
35
35
  },
36
36
  "peerDependenciesMeta": {
37
37
  "@zeltjs/redis": {
@@ -41,8 +41,8 @@
41
41
  "devDependencies": {
42
42
  "@types/node": "22.19.17",
43
43
  "ioredis": "5.10.1",
44
- "@zeltjs/core": "0.6.0",
45
- "@zeltjs/redis": "0.6.0"
44
+ "@zeltjs/core": "0.7.0",
45
+ "@zeltjs/redis": "0.7.0"
46
46
  },
47
47
  "volta": {
48
48
  "extends": "../../package.json"
@@ -1 +0,0 @@
1
- {"version":3,"file":"adaptor-memory-BcPJjrIS.js","names":[],"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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"}