polystore 0.19.0 → 0.21.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.
- package/index.d.ts +1 -0
- package/index.js +115 -26
- package/package.json +32 -8
- package/readme.md +237 -46
- package/src/integrations/express.d.ts +307 -0
- package/src/integrations/express.js +42 -0
- package/src/integrations/hono-sessions.d.ts +299 -0
- package/src/integrations/hono-sessions.js +36 -0
- package/src/express.js +0 -47
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
|
|
3
|
+
type Prefix = string;
|
|
4
|
+
type Expires = number | null | string;
|
|
5
|
+
type Options = {
|
|
6
|
+
prefix?: Prefix;
|
|
7
|
+
expires?: Expires;
|
|
8
|
+
};
|
|
9
|
+
type StoreData<T extends Serializable = Serializable> = {
|
|
10
|
+
value: T;
|
|
11
|
+
expires: number | null;
|
|
12
|
+
};
|
|
13
|
+
type Serializable = string | number | boolean | null | (Serializable | null)[] | {
|
|
14
|
+
[key: string]: Serializable | null;
|
|
15
|
+
};
|
|
16
|
+
interface ClientExpires {
|
|
17
|
+
TYPE: string;
|
|
18
|
+
HAS_EXPIRATION: true;
|
|
19
|
+
promise?: Promise<any>;
|
|
20
|
+
test?: (client: any) => boolean;
|
|
21
|
+
get<T extends Serializable>(key: string): Promise<T | null> | T | null;
|
|
22
|
+
set<T extends Serializable>(key: string, value: T, expires?: Expires): Promise<any> | any;
|
|
23
|
+
iterate<T extends Serializable>(prefix: string): AsyncGenerator<[string, T], void, unknown> | Generator<[string, T], void, unknown>;
|
|
24
|
+
add?<T extends Serializable>(prefix: string, value: T, expires?: Expires): Promise<string>;
|
|
25
|
+
has?(key: string): Promise<boolean> | boolean;
|
|
26
|
+
del?(key: string): Promise<any> | any;
|
|
27
|
+
keys?(prefix: string): Promise<string[]> | string[];
|
|
28
|
+
values?<T extends Serializable>(prefix: string): Promise<T[]> | T[];
|
|
29
|
+
entries?<T extends Serializable>(prefix: string): Promise<[string, T][]> | [string, T][];
|
|
30
|
+
all?<T extends Serializable>(prefix: string): Promise<Record<string, T>> | Record<string, T>;
|
|
31
|
+
clear?(prefix: string): Promise<any> | any;
|
|
32
|
+
clearAll?(): Promise<any> | any;
|
|
33
|
+
close?(): Promise<any> | any;
|
|
34
|
+
}
|
|
35
|
+
interface ClientNonExpires {
|
|
36
|
+
TYPE: string;
|
|
37
|
+
HAS_EXPIRATION: false;
|
|
38
|
+
promise?: Promise<any>;
|
|
39
|
+
test?: (client: any) => boolean;
|
|
40
|
+
get<T extends Serializable>(key: string): Promise<StoreData<T> | null> | StoreData<T> | null;
|
|
41
|
+
set<T extends Serializable>(key: string, value: StoreData<T> | null, ttl?: Expires): Promise<any> | any;
|
|
42
|
+
iterate<T extends Serializable>(prefix: string): AsyncGenerator<[string, StoreData<T>], void, unknown> | Generator<[string, StoreData<T>], void, unknown>;
|
|
43
|
+
add?<T extends Serializable>(prefix: string, value: StoreData<T>, ttl?: Expires): Promise<string>;
|
|
44
|
+
has?(key: string): Promise<boolean> | boolean;
|
|
45
|
+
del?(key: string): Promise<any> | any;
|
|
46
|
+
keys?(prefix: string): Promise<string[]> | string[];
|
|
47
|
+
values?<T extends Serializable>(prefix: string): Promise<StoreData<T>[]> | StoreData<T>[];
|
|
48
|
+
entries?<T extends Serializable>(prefix: string): Promise<[string, StoreData<T>][]> | [string, StoreData<T>][];
|
|
49
|
+
all?<T extends Serializable>(prefix: string): Promise<Record<string, StoreData<T>>> | Record<string, StoreData<T>>;
|
|
50
|
+
prune?(): Promise<any> | any;
|
|
51
|
+
clear?(prefix: string): Promise<any> | any;
|
|
52
|
+
clearAll?(): Promise<any> | any;
|
|
53
|
+
close?(): Promise<any> | any;
|
|
54
|
+
}
|
|
55
|
+
type Client = ClientExpires | ClientNonExpires;
|
|
56
|
+
|
|
57
|
+
declare class Store<TD extends Serializable = Serializable> {
|
|
58
|
+
#private;
|
|
59
|
+
PREFIX: Prefix;
|
|
60
|
+
EXPIRES: Expires;
|
|
61
|
+
promise: Promise<Client> | null;
|
|
62
|
+
client: Client;
|
|
63
|
+
type: string;
|
|
64
|
+
constructor(clientPromise?: any, options?: Options);
|
|
65
|
+
/**
|
|
66
|
+
* Save the data on an autogenerated key, can add expiration as well:
|
|
67
|
+
*
|
|
68
|
+
* ```js
|
|
69
|
+
* const key1 = await store.add("value1");
|
|
70
|
+
* const key2 = await store.add({ hello: "world" });
|
|
71
|
+
* const key3 = await store.add("value3", { expires: "1h" });
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
74
|
+
* **[→ Full .add() Docs](https://polystore.dev/documentation#add)**
|
|
75
|
+
*/
|
|
76
|
+
add(value: TD, options?: Options): Promise<string>;
|
|
77
|
+
add<T extends TD>(value: T, options?: Options): Promise<string>;
|
|
78
|
+
/**
|
|
79
|
+
* Save the data on the given key, can add expiration as well:
|
|
80
|
+
*
|
|
81
|
+
* ```js
|
|
82
|
+
* const key = await store.set("key1", "value1");
|
|
83
|
+
* await store.set("key2", { hello: "world" });
|
|
84
|
+
* await store.set("key3", "value3", { expires: "1h" });
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* **[→ Full .set() Docs](https://polystore.dev/documentation#set)**
|
|
88
|
+
*/
|
|
89
|
+
set(key: string, value: TD, options?: Options): Promise<string>;
|
|
90
|
+
set<T extends TD>(key: string, value: T, options?: Options): Promise<string>;
|
|
91
|
+
/**
|
|
92
|
+
* Read a single value from the KV store:
|
|
93
|
+
*
|
|
94
|
+
* ```js
|
|
95
|
+
* const value1 = await store.get("key1");
|
|
96
|
+
* // null (doesn't exist or has expired)
|
|
97
|
+
* const value2 = await store.get("key2");
|
|
98
|
+
* // "value2"
|
|
99
|
+
* const value3 = await store.get("key3");
|
|
100
|
+
* // { hello: "world" }
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* **[→ Full .get() Docs](https://polystore.dev/documentation#get)**
|
|
104
|
+
*/
|
|
105
|
+
get(key: string): Promise<TD | null>;
|
|
106
|
+
get<T extends TD>(key: string): Promise<T | null>;
|
|
107
|
+
/**
|
|
108
|
+
* Check whether a key exists or not:
|
|
109
|
+
*
|
|
110
|
+
* ```js
|
|
111
|
+
* if (await store.has("key1")) { ... }
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* If you are going to use the value, it's better to just read it:
|
|
115
|
+
*
|
|
116
|
+
* ```js
|
|
117
|
+
* const val = await store.get("key1");
|
|
118
|
+
* if (val) { ... }
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* **[→ Full .has() Docs](https://polystore.dev/documentation#has)**
|
|
122
|
+
*/
|
|
123
|
+
has(key: string): Promise<boolean>;
|
|
124
|
+
/**
|
|
125
|
+
* Remove a single key and its value from the store:
|
|
126
|
+
*
|
|
127
|
+
* ```js
|
|
128
|
+
* const key = await store.del("key1");
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* **[→ Full .del() Docs](https://polystore.dev/documentation#del)**
|
|
132
|
+
*/
|
|
133
|
+
del(key: string): Promise<string>;
|
|
134
|
+
/**
|
|
135
|
+
* @alias of .del(key: string)
|
|
136
|
+
* Remove a single key and its value from the store:
|
|
137
|
+
*
|
|
138
|
+
* ```js
|
|
139
|
+
* const key = await store.delete("key1");
|
|
140
|
+
* ```
|
|
141
|
+
*
|
|
142
|
+
* **[→ Full .del() Docs](https://polystore.dev/documentation#del)**
|
|
143
|
+
*/
|
|
144
|
+
delete(key: string): Promise<string>;
|
|
145
|
+
/**
|
|
146
|
+
* An iterator that goes through all of the key:value pairs in the client
|
|
147
|
+
*
|
|
148
|
+
* ```js
|
|
149
|
+
* for await (const [key, value] of store) {
|
|
150
|
+
* console.log(key, value);
|
|
151
|
+
* }
|
|
152
|
+
* ```
|
|
153
|
+
*
|
|
154
|
+
* **[→ Full Iterator Docs](https://polystore.dev/documentation#iterator)**
|
|
155
|
+
*/
|
|
156
|
+
[Symbol.asyncIterator](): AsyncGenerator<[string, TD], void, unknown>;
|
|
157
|
+
[Symbol.asyncIterator]<T extends TD>(): AsyncGenerator<[
|
|
158
|
+
string,
|
|
159
|
+
T
|
|
160
|
+
], void, unknown>;
|
|
161
|
+
/**
|
|
162
|
+
* Return an array of the entries, in the [key, value] format:
|
|
163
|
+
*
|
|
164
|
+
* ```js
|
|
165
|
+
* const entries = await store.entries();
|
|
166
|
+
* // [["key1", "value1"], ["key2", { hello: "world" }], ...]
|
|
167
|
+
*
|
|
168
|
+
* // To limit it to a given prefix, use `.prefix()`:
|
|
169
|
+
* const sessions = await store.prefix("session:").entries();
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
172
|
+
* **[→ Full .entries() Docs](https://polystore.dev/documentation#entries)**
|
|
173
|
+
*/
|
|
174
|
+
entries(): Promise<[string, TD][]>;
|
|
175
|
+
entries<T extends TD>(): Promise<[string, T][]>;
|
|
176
|
+
/**
|
|
177
|
+
* Return an array of the keys in the store:
|
|
178
|
+
*
|
|
179
|
+
* ```js
|
|
180
|
+
* const keys = await store.keys();
|
|
181
|
+
* // ["key1", "key2", ...]
|
|
182
|
+
*
|
|
183
|
+
* // To limit it to a given prefix, use `.prefix()`:
|
|
184
|
+
* const sessions = await store.prefix("session:").keys();
|
|
185
|
+
* ```
|
|
186
|
+
*
|
|
187
|
+
* **[→ Full .keys() Docs](https://polystore.dev/documentation#keys)**
|
|
188
|
+
*/
|
|
189
|
+
keys(): Promise<string[]>;
|
|
190
|
+
/**
|
|
191
|
+
* Return an array of the values in the store:
|
|
192
|
+
*
|
|
193
|
+
* ```js
|
|
194
|
+
* const values = await store.values();
|
|
195
|
+
* // ["value1", { hello: "world" }, ...]
|
|
196
|
+
*
|
|
197
|
+
* // To limit it to a given prefix, use `.prefix()`:
|
|
198
|
+
* const sessions = await store.prefix("session:").values();
|
|
199
|
+
* ```
|
|
200
|
+
*
|
|
201
|
+
* **[→ Full .values() Docs](https://polystore.dev/documentation#values)**
|
|
202
|
+
*/
|
|
203
|
+
values(): Promise<TD[]>;
|
|
204
|
+
values<T extends TD>(): Promise<T[]>;
|
|
205
|
+
/**
|
|
206
|
+
* Return an object with the keys:values in the store:
|
|
207
|
+
*
|
|
208
|
+
* ```js
|
|
209
|
+
* const obj = await store.all();
|
|
210
|
+
* // { key1: "value1", key2: { hello: "world" }, ... }
|
|
211
|
+
*
|
|
212
|
+
* // To limit it to a given prefix, use `.prefix()`:
|
|
213
|
+
* const sessions = await store.prefix("session:").all();
|
|
214
|
+
* ```
|
|
215
|
+
*
|
|
216
|
+
* **[→ Full .all() Docs](https://polystore.dev/documentation#all)**
|
|
217
|
+
*/
|
|
218
|
+
all(): Promise<Record<string, TD>>;
|
|
219
|
+
all<T extends TD>(): Promise<Record<string, T>>;
|
|
220
|
+
/**
|
|
221
|
+
* Create a substore where all the keys are stored with
|
|
222
|
+
* the given prefix:
|
|
223
|
+
*
|
|
224
|
+
* ```js
|
|
225
|
+
* const session = store.prefix("session:");
|
|
226
|
+
* await session.set("key1", "value1");
|
|
227
|
+
* console.log(await session.entries()); // session.
|
|
228
|
+
* // [["key1", "value1"]]
|
|
229
|
+
* console.log(await store.entries()); // store.
|
|
230
|
+
* // [["session:key1", "value1"]]
|
|
231
|
+
* ```
|
|
232
|
+
*
|
|
233
|
+
* **[→ Full .prefix() Docs](https://polystore.dev/documentation#prefix)**
|
|
234
|
+
*/
|
|
235
|
+
prefix(prefix?: Prefix): Store<TD>;
|
|
236
|
+
/**
|
|
237
|
+
* Create a substore where all the keys are stored with
|
|
238
|
+
* the given prefix:
|
|
239
|
+
*
|
|
240
|
+
* ```js
|
|
241
|
+
* const session = store.prefix("session:");
|
|
242
|
+
* await session.set("key1", "value1");
|
|
243
|
+
* console.log(await session.entries()); // session.
|
|
244
|
+
* // [["key1", "value1"]]
|
|
245
|
+
* console.log(await store.entries()); // store.
|
|
246
|
+
* // [["session:key1", "value1"]]
|
|
247
|
+
* ```
|
|
248
|
+
*
|
|
249
|
+
* **[→ Full .prefix() Docs](https://polystore.dev/documentation#prefix)**
|
|
250
|
+
*/
|
|
251
|
+
expires(expires?: Expires): Store<TD>;
|
|
252
|
+
/**
|
|
253
|
+
* Delete all of the records of the store:
|
|
254
|
+
*
|
|
255
|
+
* ```js
|
|
256
|
+
* await store.clear();
|
|
257
|
+
* ```
|
|
258
|
+
*
|
|
259
|
+
* It's useful for cache invalidation, clearing the data, and testing.
|
|
260
|
+
*
|
|
261
|
+
* **[→ Full .clear() Docs](https://polystore.dev/documentation#clear)**
|
|
262
|
+
*/
|
|
263
|
+
clear(): Promise<void>;
|
|
264
|
+
/**
|
|
265
|
+
* Remove all expired records from the store.
|
|
266
|
+
*
|
|
267
|
+
* ```js
|
|
268
|
+
* await store.prune();
|
|
269
|
+
* ```
|
|
270
|
+
*
|
|
271
|
+
* Only affects stores where expiration is managed by this wrapper.
|
|
272
|
+
*/
|
|
273
|
+
prune(): Promise<void>;
|
|
274
|
+
/**
|
|
275
|
+
* Stop the connection to the store, if any:
|
|
276
|
+
*
|
|
277
|
+
* ```js
|
|
278
|
+
* await session.set("key1", "value1");
|
|
279
|
+
* await store.close();
|
|
280
|
+
* await session.set("key2", "value2"); // error
|
|
281
|
+
* ```
|
|
282
|
+
*
|
|
283
|
+
* **[→ Full .close() Docs](https://polystore.dev/documentation#close)**
|
|
284
|
+
*/
|
|
285
|
+
close(): Promise<void>;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
interface SessionData {
|
|
289
|
+
cookie?: {
|
|
290
|
+
originalMaxAge?: number | null;
|
|
291
|
+
[key: string]: any;
|
|
292
|
+
};
|
|
293
|
+
[key: string]: any;
|
|
294
|
+
}
|
|
295
|
+
type Callback = (err?: any) => void;
|
|
296
|
+
declare class PolystoreSessionStore extends EventEmitter {
|
|
297
|
+
private store;
|
|
298
|
+
constructor(store: Store);
|
|
299
|
+
prefix(prefix?: string): PolystoreSessionStore;
|
|
300
|
+
get(sid: string, cb: (err: any, session?: SessionData | null) => void): void;
|
|
301
|
+
set(sid: string, data: SessionData, cb?: Callback): void;
|
|
302
|
+
destroy(sid: string, cb?: Callback): void;
|
|
303
|
+
touch(sid: string, data: SessionData, cb?: Callback): void;
|
|
304
|
+
}
|
|
305
|
+
declare function expressStore(client?: Map<any, any>): PolystoreSessionStore;
|
|
306
|
+
|
|
307
|
+
export { PolystoreSessionStore, expressStore as default };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// src/integrations/express.ts
|
|
2
|
+
import session from "express-session";
|
|
3
|
+
import kv from "polystore";
|
|
4
|
+
var ttlFromSession = (data) => {
|
|
5
|
+
const maxAge = data?.cookie?.originalMaxAge;
|
|
6
|
+
return typeof maxAge === "number" ? { expires: Math.ceil(maxAge / 1e3) } : void 0;
|
|
7
|
+
};
|
|
8
|
+
var PolystoreSessionStore = class _PolystoreSessionStore extends session.Store {
|
|
9
|
+
store;
|
|
10
|
+
constructor(store) {
|
|
11
|
+
super();
|
|
12
|
+
this.store = store;
|
|
13
|
+
}
|
|
14
|
+
prefix(prefix = "") {
|
|
15
|
+
return new _PolystoreSessionStore(this.store.prefix(prefix));
|
|
16
|
+
}
|
|
17
|
+
get(sid, cb) {
|
|
18
|
+
this.store.get(sid).then((data) => cb(null, data)).catch((err) => err?.code === "ENOENT" ? cb(null, null) : cb(err));
|
|
19
|
+
}
|
|
20
|
+
set(sid, data, cb) {
|
|
21
|
+
this.store.set(sid, data, ttlFromSession(data)).then(() => cb?.()).catch((err) => cb?.(err));
|
|
22
|
+
}
|
|
23
|
+
destroy(sid, cb) {
|
|
24
|
+
this.store.del(sid).then(() => cb?.()).catch((err) => cb?.(err));
|
|
25
|
+
}
|
|
26
|
+
touch(sid, data, cb) {
|
|
27
|
+
this.store.set(sid, data, ttlFromSession(data)).then(() => cb?.()).catch((err) => cb?.(err));
|
|
28
|
+
}
|
|
29
|
+
all(cb) {
|
|
30
|
+
this.store.values().then((vals) => cb(null, vals)).catch(cb);
|
|
31
|
+
}
|
|
32
|
+
clear(cb) {
|
|
33
|
+
this.store.clear().then(() => cb?.()).catch((err) => cb?.(err));
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
function expressStore(client = /* @__PURE__ */ new Map()) {
|
|
37
|
+
return new PolystoreSessionStore(kv(client));
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
PolystoreSessionStore,
|
|
41
|
+
expressStore as default
|
|
42
|
+
};
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { Store as Store$1, SessionData } from 'hono-sessions';
|
|
2
|
+
|
|
3
|
+
type Prefix = string;
|
|
4
|
+
type Expires = number | null | string;
|
|
5
|
+
type Options = {
|
|
6
|
+
prefix?: Prefix;
|
|
7
|
+
expires?: Expires;
|
|
8
|
+
};
|
|
9
|
+
type StoreData<T extends Serializable = Serializable> = {
|
|
10
|
+
value: T;
|
|
11
|
+
expires: number | null;
|
|
12
|
+
};
|
|
13
|
+
type Serializable = string | number | boolean | null | (Serializable | null)[] | {
|
|
14
|
+
[key: string]: Serializable | null;
|
|
15
|
+
};
|
|
16
|
+
interface ClientExpires {
|
|
17
|
+
TYPE: string;
|
|
18
|
+
HAS_EXPIRATION: true;
|
|
19
|
+
promise?: Promise<any>;
|
|
20
|
+
test?: (client: any) => boolean;
|
|
21
|
+
get<T extends Serializable>(key: string): Promise<T | null> | T | null;
|
|
22
|
+
set<T extends Serializable>(key: string, value: T, expires?: Expires): Promise<any> | any;
|
|
23
|
+
iterate<T extends Serializable>(prefix: string): AsyncGenerator<[string, T], void, unknown> | Generator<[string, T], void, unknown>;
|
|
24
|
+
add?<T extends Serializable>(prefix: string, value: T, expires?: Expires): Promise<string>;
|
|
25
|
+
has?(key: string): Promise<boolean> | boolean;
|
|
26
|
+
del?(key: string): Promise<any> | any;
|
|
27
|
+
keys?(prefix: string): Promise<string[]> | string[];
|
|
28
|
+
values?<T extends Serializable>(prefix: string): Promise<T[]> | T[];
|
|
29
|
+
entries?<T extends Serializable>(prefix: string): Promise<[string, T][]> | [string, T][];
|
|
30
|
+
all?<T extends Serializable>(prefix: string): Promise<Record<string, T>> | Record<string, T>;
|
|
31
|
+
clear?(prefix: string): Promise<any> | any;
|
|
32
|
+
clearAll?(): Promise<any> | any;
|
|
33
|
+
close?(): Promise<any> | any;
|
|
34
|
+
}
|
|
35
|
+
interface ClientNonExpires {
|
|
36
|
+
TYPE: string;
|
|
37
|
+
HAS_EXPIRATION: false;
|
|
38
|
+
promise?: Promise<any>;
|
|
39
|
+
test?: (client: any) => boolean;
|
|
40
|
+
get<T extends Serializable>(key: string): Promise<StoreData<T> | null> | StoreData<T> | null;
|
|
41
|
+
set<T extends Serializable>(key: string, value: StoreData<T> | null, ttl?: Expires): Promise<any> | any;
|
|
42
|
+
iterate<T extends Serializable>(prefix: string): AsyncGenerator<[string, StoreData<T>], void, unknown> | Generator<[string, StoreData<T>], void, unknown>;
|
|
43
|
+
add?<T extends Serializable>(prefix: string, value: StoreData<T>, ttl?: Expires): Promise<string>;
|
|
44
|
+
has?(key: string): Promise<boolean> | boolean;
|
|
45
|
+
del?(key: string): Promise<any> | any;
|
|
46
|
+
keys?(prefix: string): Promise<string[]> | string[];
|
|
47
|
+
values?<T extends Serializable>(prefix: string): Promise<StoreData<T>[]> | StoreData<T>[];
|
|
48
|
+
entries?<T extends Serializable>(prefix: string): Promise<[string, StoreData<T>][]> | [string, StoreData<T>][];
|
|
49
|
+
all?<T extends Serializable>(prefix: string): Promise<Record<string, StoreData<T>>> | Record<string, StoreData<T>>;
|
|
50
|
+
prune?(): Promise<any> | any;
|
|
51
|
+
clear?(prefix: string): Promise<any> | any;
|
|
52
|
+
clearAll?(): Promise<any> | any;
|
|
53
|
+
close?(): Promise<any> | any;
|
|
54
|
+
}
|
|
55
|
+
type Client = ClientExpires | ClientNonExpires;
|
|
56
|
+
|
|
57
|
+
declare class Store<TD extends Serializable = Serializable> {
|
|
58
|
+
#private;
|
|
59
|
+
PREFIX: Prefix;
|
|
60
|
+
EXPIRES: Expires;
|
|
61
|
+
promise: Promise<Client> | null;
|
|
62
|
+
client: Client;
|
|
63
|
+
type: string;
|
|
64
|
+
constructor(clientPromise?: any, options?: Options);
|
|
65
|
+
/**
|
|
66
|
+
* Save the data on an autogenerated key, can add expiration as well:
|
|
67
|
+
*
|
|
68
|
+
* ```js
|
|
69
|
+
* const key1 = await store.add("value1");
|
|
70
|
+
* const key2 = await store.add({ hello: "world" });
|
|
71
|
+
* const key3 = await store.add("value3", { expires: "1h" });
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
74
|
+
* **[→ Full .add() Docs](https://polystore.dev/documentation#add)**
|
|
75
|
+
*/
|
|
76
|
+
add(value: TD, options?: Options): Promise<string>;
|
|
77
|
+
add<T extends TD>(value: T, options?: Options): Promise<string>;
|
|
78
|
+
/**
|
|
79
|
+
* Save the data on the given key, can add expiration as well:
|
|
80
|
+
*
|
|
81
|
+
* ```js
|
|
82
|
+
* const key = await store.set("key1", "value1");
|
|
83
|
+
* await store.set("key2", { hello: "world" });
|
|
84
|
+
* await store.set("key3", "value3", { expires: "1h" });
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* **[→ Full .set() Docs](https://polystore.dev/documentation#set)**
|
|
88
|
+
*/
|
|
89
|
+
set(key: string, value: TD, options?: Options): Promise<string>;
|
|
90
|
+
set<T extends TD>(key: string, value: T, options?: Options): Promise<string>;
|
|
91
|
+
/**
|
|
92
|
+
* Read a single value from the KV store:
|
|
93
|
+
*
|
|
94
|
+
* ```js
|
|
95
|
+
* const value1 = await store.get("key1");
|
|
96
|
+
* // null (doesn't exist or has expired)
|
|
97
|
+
* const value2 = await store.get("key2");
|
|
98
|
+
* // "value2"
|
|
99
|
+
* const value3 = await store.get("key3");
|
|
100
|
+
* // { hello: "world" }
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* **[→ Full .get() Docs](https://polystore.dev/documentation#get)**
|
|
104
|
+
*/
|
|
105
|
+
get(key: string): Promise<TD | null>;
|
|
106
|
+
get<T extends TD>(key: string): Promise<T | null>;
|
|
107
|
+
/**
|
|
108
|
+
* Check whether a key exists or not:
|
|
109
|
+
*
|
|
110
|
+
* ```js
|
|
111
|
+
* if (await store.has("key1")) { ... }
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* If you are going to use the value, it's better to just read it:
|
|
115
|
+
*
|
|
116
|
+
* ```js
|
|
117
|
+
* const val = await store.get("key1");
|
|
118
|
+
* if (val) { ... }
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* **[→ Full .has() Docs](https://polystore.dev/documentation#has)**
|
|
122
|
+
*/
|
|
123
|
+
has(key: string): Promise<boolean>;
|
|
124
|
+
/**
|
|
125
|
+
* Remove a single key and its value from the store:
|
|
126
|
+
*
|
|
127
|
+
* ```js
|
|
128
|
+
* const key = await store.del("key1");
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* **[→ Full .del() Docs](https://polystore.dev/documentation#del)**
|
|
132
|
+
*/
|
|
133
|
+
del(key: string): Promise<string>;
|
|
134
|
+
/**
|
|
135
|
+
* @alias of .del(key: string)
|
|
136
|
+
* Remove a single key and its value from the store:
|
|
137
|
+
*
|
|
138
|
+
* ```js
|
|
139
|
+
* const key = await store.delete("key1");
|
|
140
|
+
* ```
|
|
141
|
+
*
|
|
142
|
+
* **[→ Full .del() Docs](https://polystore.dev/documentation#del)**
|
|
143
|
+
*/
|
|
144
|
+
delete(key: string): Promise<string>;
|
|
145
|
+
/**
|
|
146
|
+
* An iterator that goes through all of the key:value pairs in the client
|
|
147
|
+
*
|
|
148
|
+
* ```js
|
|
149
|
+
* for await (const [key, value] of store) {
|
|
150
|
+
* console.log(key, value);
|
|
151
|
+
* }
|
|
152
|
+
* ```
|
|
153
|
+
*
|
|
154
|
+
* **[→ Full Iterator Docs](https://polystore.dev/documentation#iterator)**
|
|
155
|
+
*/
|
|
156
|
+
[Symbol.asyncIterator](): AsyncGenerator<[string, TD], void, unknown>;
|
|
157
|
+
[Symbol.asyncIterator]<T extends TD>(): AsyncGenerator<[
|
|
158
|
+
string,
|
|
159
|
+
T
|
|
160
|
+
], void, unknown>;
|
|
161
|
+
/**
|
|
162
|
+
* Return an array of the entries, in the [key, value] format:
|
|
163
|
+
*
|
|
164
|
+
* ```js
|
|
165
|
+
* const entries = await store.entries();
|
|
166
|
+
* // [["key1", "value1"], ["key2", { hello: "world" }], ...]
|
|
167
|
+
*
|
|
168
|
+
* // To limit it to a given prefix, use `.prefix()`:
|
|
169
|
+
* const sessions = await store.prefix("session:").entries();
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
172
|
+
* **[→ Full .entries() Docs](https://polystore.dev/documentation#entries)**
|
|
173
|
+
*/
|
|
174
|
+
entries(): Promise<[string, TD][]>;
|
|
175
|
+
entries<T extends TD>(): Promise<[string, T][]>;
|
|
176
|
+
/**
|
|
177
|
+
* Return an array of the keys in the store:
|
|
178
|
+
*
|
|
179
|
+
* ```js
|
|
180
|
+
* const keys = await store.keys();
|
|
181
|
+
* // ["key1", "key2", ...]
|
|
182
|
+
*
|
|
183
|
+
* // To limit it to a given prefix, use `.prefix()`:
|
|
184
|
+
* const sessions = await store.prefix("session:").keys();
|
|
185
|
+
* ```
|
|
186
|
+
*
|
|
187
|
+
* **[→ Full .keys() Docs](https://polystore.dev/documentation#keys)**
|
|
188
|
+
*/
|
|
189
|
+
keys(): Promise<string[]>;
|
|
190
|
+
/**
|
|
191
|
+
* Return an array of the values in the store:
|
|
192
|
+
*
|
|
193
|
+
* ```js
|
|
194
|
+
* const values = await store.values();
|
|
195
|
+
* // ["value1", { hello: "world" }, ...]
|
|
196
|
+
*
|
|
197
|
+
* // To limit it to a given prefix, use `.prefix()`:
|
|
198
|
+
* const sessions = await store.prefix("session:").values();
|
|
199
|
+
* ```
|
|
200
|
+
*
|
|
201
|
+
* **[→ Full .values() Docs](https://polystore.dev/documentation#values)**
|
|
202
|
+
*/
|
|
203
|
+
values(): Promise<TD[]>;
|
|
204
|
+
values<T extends TD>(): Promise<T[]>;
|
|
205
|
+
/**
|
|
206
|
+
* Return an object with the keys:values in the store:
|
|
207
|
+
*
|
|
208
|
+
* ```js
|
|
209
|
+
* const obj = await store.all();
|
|
210
|
+
* // { key1: "value1", key2: { hello: "world" }, ... }
|
|
211
|
+
*
|
|
212
|
+
* // To limit it to a given prefix, use `.prefix()`:
|
|
213
|
+
* const sessions = await store.prefix("session:").all();
|
|
214
|
+
* ```
|
|
215
|
+
*
|
|
216
|
+
* **[→ Full .all() Docs](https://polystore.dev/documentation#all)**
|
|
217
|
+
*/
|
|
218
|
+
all(): Promise<Record<string, TD>>;
|
|
219
|
+
all<T extends TD>(): Promise<Record<string, T>>;
|
|
220
|
+
/**
|
|
221
|
+
* Create a substore where all the keys are stored with
|
|
222
|
+
* the given prefix:
|
|
223
|
+
*
|
|
224
|
+
* ```js
|
|
225
|
+
* const session = store.prefix("session:");
|
|
226
|
+
* await session.set("key1", "value1");
|
|
227
|
+
* console.log(await session.entries()); // session.
|
|
228
|
+
* // [["key1", "value1"]]
|
|
229
|
+
* console.log(await store.entries()); // store.
|
|
230
|
+
* // [["session:key1", "value1"]]
|
|
231
|
+
* ```
|
|
232
|
+
*
|
|
233
|
+
* **[→ Full .prefix() Docs](https://polystore.dev/documentation#prefix)**
|
|
234
|
+
*/
|
|
235
|
+
prefix(prefix?: Prefix): Store<TD>;
|
|
236
|
+
/**
|
|
237
|
+
* Create a substore where all the keys are stored with
|
|
238
|
+
* the given prefix:
|
|
239
|
+
*
|
|
240
|
+
* ```js
|
|
241
|
+
* const session = store.prefix("session:");
|
|
242
|
+
* await session.set("key1", "value1");
|
|
243
|
+
* console.log(await session.entries()); // session.
|
|
244
|
+
* // [["key1", "value1"]]
|
|
245
|
+
* console.log(await store.entries()); // store.
|
|
246
|
+
* // [["session:key1", "value1"]]
|
|
247
|
+
* ```
|
|
248
|
+
*
|
|
249
|
+
* **[→ Full .prefix() Docs](https://polystore.dev/documentation#prefix)**
|
|
250
|
+
*/
|
|
251
|
+
expires(expires?: Expires): Store<TD>;
|
|
252
|
+
/**
|
|
253
|
+
* Delete all of the records of the store:
|
|
254
|
+
*
|
|
255
|
+
* ```js
|
|
256
|
+
* await store.clear();
|
|
257
|
+
* ```
|
|
258
|
+
*
|
|
259
|
+
* It's useful for cache invalidation, clearing the data, and testing.
|
|
260
|
+
*
|
|
261
|
+
* **[→ Full .clear() Docs](https://polystore.dev/documentation#clear)**
|
|
262
|
+
*/
|
|
263
|
+
clear(): Promise<void>;
|
|
264
|
+
/**
|
|
265
|
+
* Remove all expired records from the store.
|
|
266
|
+
*
|
|
267
|
+
* ```js
|
|
268
|
+
* await store.prune();
|
|
269
|
+
* ```
|
|
270
|
+
*
|
|
271
|
+
* Only affects stores where expiration is managed by this wrapper.
|
|
272
|
+
*/
|
|
273
|
+
prune(): Promise<void>;
|
|
274
|
+
/**
|
|
275
|
+
* Stop the connection to the store, if any:
|
|
276
|
+
*
|
|
277
|
+
* ```js
|
|
278
|
+
* await session.set("key1", "value1");
|
|
279
|
+
* await store.close();
|
|
280
|
+
* await session.set("key2", "value2"); // error
|
|
281
|
+
* ```
|
|
282
|
+
*
|
|
283
|
+
* **[→ Full .close() Docs](https://polystore.dev/documentation#close)**
|
|
284
|
+
*/
|
|
285
|
+
close(): Promise<void>;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
declare class PolystoreHonoStore implements Store$1 {
|
|
289
|
+
private store;
|
|
290
|
+
constructor(store: Store);
|
|
291
|
+
prefix(prefix?: string): PolystoreHonoStore;
|
|
292
|
+
getSessionById(sessionId?: string): Promise<SessionData | null | undefined>;
|
|
293
|
+
createSession(sessionId: string, initialData: SessionData): Promise<void>;
|
|
294
|
+
persistSessionData(sessionId: string, sessionData: SessionData): Promise<void>;
|
|
295
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
296
|
+
}
|
|
297
|
+
declare function honoStore(client?: Map<any, any>): PolystoreHonoStore;
|
|
298
|
+
|
|
299
|
+
export { PolystoreHonoStore, honoStore as default };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// src/integrations/hono-sessions.ts
|
|
2
|
+
import kv from "polystore";
|
|
3
|
+
var ttlFromSession = (data) => {
|
|
4
|
+
if (!data._expire) return void 0;
|
|
5
|
+
const secs = Math.ceil((new Date(data._expire).getTime() - Date.now()) / 1e3);
|
|
6
|
+
return secs > 0 ? { expires: secs } : void 0;
|
|
7
|
+
};
|
|
8
|
+
var PolystoreHonoStore = class _PolystoreHonoStore {
|
|
9
|
+
store;
|
|
10
|
+
constructor(store) {
|
|
11
|
+
this.store = store;
|
|
12
|
+
}
|
|
13
|
+
prefix(prefix = "") {
|
|
14
|
+
return new _PolystoreHonoStore(this.store.prefix(prefix));
|
|
15
|
+
}
|
|
16
|
+
async getSessionById(sessionId) {
|
|
17
|
+
if (!sessionId) return null;
|
|
18
|
+
return this.store.get(sessionId);
|
|
19
|
+
}
|
|
20
|
+
async createSession(sessionId, initialData) {
|
|
21
|
+
await this.store.set(sessionId, initialData, ttlFromSession(initialData));
|
|
22
|
+
}
|
|
23
|
+
async persistSessionData(sessionId, sessionData) {
|
|
24
|
+
await this.store.set(sessionId, sessionData, ttlFromSession(sessionData));
|
|
25
|
+
}
|
|
26
|
+
async deleteSession(sessionId) {
|
|
27
|
+
await this.store.del(sessionId);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
function honoStore(client = /* @__PURE__ */ new Map()) {
|
|
31
|
+
return new PolystoreHonoStore(kv(client));
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
PolystoreHonoStore,
|
|
35
|
+
honoStore as default
|
|
36
|
+
};
|