UNPKG

2.65 kBPlain TextView Raw
1/**
2 * Copyright (c) Microsoft Corporation. All rights reserved.
3 * Licensed under the MIT License.
4 */
5import { Storage, StoreItems, StoreItem } from 'botbuilder'
6import * as Redis from 'redis'
7import { CLDebug } from './CLDebug';
8
9/** Additional settings for configuring an instance of RedisStorage */
10export interface RedisStorageSettings {
11 /** Redis server. */
12 server: string
13
14 /** Storage access key. */
15 key: string
16
17 /** Port. */
18 port?: number
19}
20
21export class RedisStorage implements Storage {
22 private redisClient: Redis.RedisClient
23 private _get: (...args: any[]) => Promise<any>
24 private _set: (...args: any[]) => Promise<any>
25 private _del: (...args: any[]) => Promise<any>
26
27 constructor(settings: RedisStorageSettings) {
28
29 this.redisClient = Redis.createClient(settings.port ? settings.port : 6380, settings.server, {
30 auth_pass: settings.key,
31 tls: { servername: settings.server }
32 })
33
34 this.redisClient.on('error', (err) => {
35 CLDebug.Error(err, "RedisStorage")
36 })
37
38 this._get = this.promisify(this.redisClient.get)
39 this._set = this.promisify(this.redisClient.set)
40 this._del = this.promisify(this.redisClient.del)
41 }
42
43 /**
44 * Loads store items from storage
45 *
46 * @param keys Array of item keys to read from the store.
47 */
48 public async read(keys: string[]): Promise<StoreItems> {
49 let storeItems: StoreItems = {}
50
51 // foreach key
52 for (let iKey in keys) {
53 let key = keys[iKey]
54 let storeItem = await this._get(key)
55 storeItems[key] = JSON.parse(storeItem)
56 }
57 return storeItems
58 }
59
60 /**
61 * Saves store items to storage.
62 *
63 * @param changes Map of items to write to storage.
64 */
65 public async write(changes: StoreItems): Promise<void> {
66 for (let key in changes) {
67 let storeItem: StoreItem = changes[key]
68 await this._set(key, JSON.stringify(storeItem))
69 }
70 }
71
72 /**
73 * Removes store items from storage
74 *
75 * @param keys Array of item keys to remove from the store.
76 */
77 public async delete(keys: string[]) {
78 for (let iKey in keys) {
79 let key = keys[iKey]
80 await this._del(key)
81 }
82 }
83
84 private promisify(func: Function) {
85 return (...args: any[]) =>
86 new Promise<any>((resolve, reject) => {
87 const callback = (err: any, data: any) => (err ? reject(err) : resolve(data))
88
89 func.apply(this.redisClient, [...args, callback])
90 })
91 }
92}
93
\No newline at end of file