@zeltjs/kv 0.7.0 → 0.8.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 "../index-BlASVNzQ.js";
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-B0UGDGRU.js";
1
+ import { t as MemoryKVAdaptor } from "../adaptor-memory-BpDnyuqz.js";
2
2
  export { MemoryKVAdaptor };
@@ -1,4 +1,4 @@
1
- import { i as ZeltKVInvalidTtlError, n as serialize, r as joinPrefix, t as deserialize } from "./serialize-DwL5y2vb.js";
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 + key;
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-B0UGDGRU.js.map
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, o as NonEmptyString, t as AtomicKVAdaptor } from "../types-PDNBLwuJ.js";
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-adaptor.d.ts
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
- constructor(redis?: RedisService);
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-adaptor.ts"],"mappings":";;;;cAOa,cAAA,YAA0B,eAAA;EAAA,iBACR,KAAA;cAAA,KAAA,GAAK,YAAA;EAElC,SAAA,wBAAA,CAAkC,MAAA,EAAQ,cAAA,CAAe,CAAA,IAAK,aAAA;AAAA"}
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 { i as ZeltKVInvalidTtlError, n as serialize, r as joinPrefix, t as deserialize } from "../serialize-DwL5y2vb.js";
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 + key;
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
- return incrWithTtl(this.client, this.k(key), by, opts?.ttlSec);
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-adaptor.ts
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","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"}
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, o as NonEmptyString, t as AtomicKVAdaptor } from "./types-PDNBLwuJ.js";
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-BlASVNzQ.d.ts.map
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 KVStore, i as KVAdaptor, n as AtomicKVStore, o as NonEmptyString, r as Defined, s as SetOptions, t as AtomicKVAdaptor } from "./types-PDNBLwuJ.js";
2
- import { t as MemoryKVAdaptor } from "./index-BlASVNzQ.js";
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
- //#region src/namespace.d.ts
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/errors.ts","../src/namespace.ts","../src/serialize.ts"],"mappings":";;;;cAEa,qBAAA,OAAqB,OAAA;;uBAGjC,KAAA;EAAA;;;;;cAEY,uBAAA,GACX,GAAA,cACC,GAAA,IAAO,YAAA,QAAoB,qBAAA;;;cCTjB,UAAA,GAAc,CAAA,UAAW,CAAA;;;cCEzB,SAAA,GAAa,KAAA,EAAO,OAAA;AAAA,cAIpB,WAAA,MAAkB,GAAA,oBAAqB,CAAA"}
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 { 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-B0UGDGRU.js";
3
- export { MemoryKVAdaptor as MemoryKV, MemoryKVAdaptor, MemoryKVAdaptor as MemoryKVService, ZeltKVInvalidTtlError, deserialize, isZeltKVInvalidTtlError, joinPrefix, serialize };
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
- export { KVStore as a, KVAdaptor as i, AtomicKVStore as n, NonEmptyString as o, Defined as r, SetOptions as s, AtomicKVAdaptor as t };
52
- //# sourceMappingURL=types-PDNBLwuJ.d.ts.map
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.7.0",
3
+ "version": "0.8.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/core": "0.7.0",
34
- "@zeltjs/redis": "0.7.0"
33
+ "@zeltjs/core": "0.8.0",
34
+ "@zeltjs/redis": "0.8.0"
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.7.0",
45
- "@zeltjs/redis": "0.7.0"
44
+ "@zeltjs/unsafe-type-lib": "0.8.0",
45
+ "@zeltjs/core": "0.8.0",
46
+ "@zeltjs/redis": "0.8.0"
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"}