remove redis dep from deps.ts and move to redisCache.ts
This commit is contained in:
		
							parent
							
								
									4462d7d832
								
							
						
					
					
						commit
						62b2aa07de
					
				
					 4 changed files with 106 additions and 109 deletions
				
			
		
							
								
								
									
										5
									
								
								deps.ts
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								deps.ts
									
										
									
									
									
								
							|  | @ -2,11 +2,6 @@ export { EventEmitter } from 'https://deno.land/x/event@0.2.1/mod.ts' | ||||||
| export { unzlib } from 'https://denopkg.com/DjDeveloperr/denoflate@1.2/mod.ts' | export { unzlib } from 'https://denopkg.com/DjDeveloperr/denoflate@1.2/mod.ts' | ||||||
| export { fetchAuto } from 'https://deno.land/x/fetchbase64@1.0.0/mod.ts' | export { fetchAuto } from 'https://deno.land/x/fetchbase64@1.0.0/mod.ts' | ||||||
| export { parse } from 'https://deno.land/x/mutil@0.1.2/mod.ts' | export { parse } from 'https://deno.land/x/mutil@0.1.2/mod.ts' | ||||||
| export { connect } from 'https://deno.land/x/redis@v0.14.1/mod.ts' |  | ||||||
| export type { |  | ||||||
|   Redis, |  | ||||||
|   RedisConnectOptions |  | ||||||
| } from 'https://deno.land/x/redis@v0.14.1/mod.ts' |  | ||||||
| export { walk } from 'https://deno.land/std@0.86.0/fs/walk.ts' | export { walk } from 'https://deno.land/std@0.86.0/fs/walk.ts' | ||||||
| export { join } from 'https://deno.land/std@0.86.0/path/mod.ts' | export { join } from 'https://deno.land/std@0.86.0/path/mod.ts' | ||||||
| export { Mixin } from 'https://esm.sh/ts-mixer@5.4.0' | export { Mixin } from 'https://esm.sh/ts-mixer@5.4.0' | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								mod.ts
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								mod.ts
									
										
									
									
									
								
							|  | @ -166,3 +166,4 @@ export type { VoiceStatePayload } from './src/types/voice.ts' | ||||||
| export type { WebhookPayload } from './src/types/webhook.ts' | export type { WebhookPayload } from './src/types/webhook.ts' | ||||||
| export * from './src/models/collectors.ts' | export * from './src/models/collectors.ts' | ||||||
| export type { Dict } from './src/utils/dict.ts' | export type { Dict } from './src/utils/dict.ts' | ||||||
|  | export * from './src/models/redisCache.ts' | ||||||
|  |  | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| import { Collection } from '../utils/collection.ts' | import { Collection } from '../utils/collection.ts' | ||||||
| import { connect, Redis, RedisConnectOptions } from '../../deps.ts' |  | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * ICacheAdapter is the interface to be implemented by Cache Adapters for them to be usable with Harmony. |  * ICacheAdapter is the interface to be implemented by Cache Adapters for them to be usable with Harmony. | ||||||
|  | @ -71,106 +70,3 @@ export class DefaultCacheAdapter implements ICacheAdapter { | ||||||
|     return delete this.data[cacheName] |     return delete this.data[cacheName] | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| /** Redis Cache Adapter for using Redis as a cache-provider. */ |  | ||||||
| export class RedisCacheAdapter implements ICacheAdapter { |  | ||||||
|   _redis: Promise<Redis> |  | ||||||
|   redis?: Redis |  | ||||||
|   ready: boolean = false |  | ||||||
|   readonly _expireIntervalTimer: number = 5000 |  | ||||||
|   private _expireInterval?: number |  | ||||||
| 
 |  | ||||||
|   constructor(options: RedisConnectOptions) { |  | ||||||
|     this._redis = connect(options) |  | ||||||
|     this._redis.then( |  | ||||||
|       (redis) => { |  | ||||||
|         this.redis = redis |  | ||||||
|         this.ready = true |  | ||||||
|         this._startExpireInterval() |  | ||||||
|       }, |  | ||||||
|       () => { |  | ||||||
|         // TODO: Make error for this
 |  | ||||||
|       } |  | ||||||
|     ) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   private _startExpireInterval(): void { |  | ||||||
|     this._expireInterval = setInterval(() => { |  | ||||||
|       this.redis?.scan(0, { pattern: '*:expires' }).then(([_, names]) => { |  | ||||||
|         for (const name of names) { |  | ||||||
|           this.redis?.hvals(name).then((vals) => { |  | ||||||
|             for (const val of vals) { |  | ||||||
|               const expireVal: { |  | ||||||
|                 name: string |  | ||||||
|                 key: string |  | ||||||
|                 at: number |  | ||||||
|               } = JSON.parse(val) |  | ||||||
|               const expired = new Date().getTime() > expireVal.at |  | ||||||
|               if (expired) this.redis?.hdel(expireVal.name, expireVal.key) |  | ||||||
|             } |  | ||||||
|           }) |  | ||||||
|         } |  | ||||||
|       }) |  | ||||||
|     }, this._expireIntervalTimer) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   async _checkReady(): Promise<void> { |  | ||||||
|     if (!this.ready) await this._redis |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   async get(cacheName: string, key: string): Promise<string | undefined> { |  | ||||||
|     await this._checkReady() |  | ||||||
|     const cache = await this.redis?.hget(cacheName, key) |  | ||||||
|     if (cache === undefined) return |  | ||||||
|     try { |  | ||||||
|       return JSON.parse(cache) |  | ||||||
|     } catch (e) { |  | ||||||
|       return cache |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   async set( |  | ||||||
|     cacheName: string, |  | ||||||
|     key: string, |  | ||||||
|     value: any, |  | ||||||
|     expire?: number |  | ||||||
|   ): Promise<number | undefined> { |  | ||||||
|     await this._checkReady() |  | ||||||
|     const result = await this.redis?.hset( |  | ||||||
|       cacheName, |  | ||||||
|       key, |  | ||||||
|       typeof value === 'object' ? JSON.stringify(value) : value |  | ||||||
|     ) |  | ||||||
|     if (expire !== undefined) { |  | ||||||
|       await this.redis?.hset( |  | ||||||
|         `${cacheName}:expires`, |  | ||||||
|         key, |  | ||||||
|         JSON.stringify({ |  | ||||||
|           name: cacheName, |  | ||||||
|           key, |  | ||||||
|           at: new Date().getTime() + expire |  | ||||||
|         }) |  | ||||||
|       ) |  | ||||||
|     } |  | ||||||
|     return result |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   async delete(cacheName: string, key: string): Promise<boolean> { |  | ||||||
|     await this._checkReady() |  | ||||||
|     const exists = await this.redis?.hexists(cacheName, key) |  | ||||||
|     if (exists === 0) return false |  | ||||||
|     await this.redis?.hdel(cacheName, key) |  | ||||||
|     return true |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   async array(cacheName: string): Promise<any[] | undefined> { |  | ||||||
|     await this._checkReady() |  | ||||||
|     const data = await this.redis?.hvals(cacheName) |  | ||||||
|     return data?.map((e: string) => JSON.parse(e)) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   async deleteCache(cacheName: string): Promise<boolean> { |  | ||||||
|     await this._checkReady() |  | ||||||
|     return (await this.redis?.del(cacheName)) !== 0 |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
							
								
								
									
										105
									
								
								src/models/redisCache.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								src/models/redisCache.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,105 @@ | ||||||
|  | import { ICacheAdapter } from './cacheAdapter.ts' | ||||||
|  | import { connect, Redis, RedisConnectOptions } from 'https://deno.land/x/redis@v0.14.1/mod.ts' | ||||||
|  | 
 | ||||||
|  | /** Redis Cache Adapter for using Redis as a cache-provider. */ | ||||||
|  | export class RedisCacheAdapter implements ICacheAdapter { | ||||||
|  |   _redis: Promise<Redis> | ||||||
|  |   redis?: Redis | ||||||
|  |   ready: boolean = false | ||||||
|  |   readonly _expireIntervalTimer: number = 5000 | ||||||
|  |   private _expireInterval?: number | ||||||
|  | 
 | ||||||
|  |   constructor(options: RedisConnectOptions) { | ||||||
|  |     this._redis = connect(options) | ||||||
|  |     this._redis.then( | ||||||
|  |       (redis) => { | ||||||
|  |         this.redis = redis | ||||||
|  |         this.ready = true | ||||||
|  |         this._startExpireInterval() | ||||||
|  |       }, | ||||||
|  |       () => { | ||||||
|  |         // TODO: Make error for this
 | ||||||
|  |       } | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private _startExpireInterval(): void { | ||||||
|  |     this._expireInterval = setInterval(() => { | ||||||
|  |       this.redis?.scan(0, { pattern: '*:expires' }).then(([_, names]) => { | ||||||
|  |         for (const name of names) { | ||||||
|  |           this.redis?.hvals(name).then((vals) => { | ||||||
|  |             for (const val of vals) { | ||||||
|  |               const expireVal: { | ||||||
|  |                 name: string | ||||||
|  |                 key: string | ||||||
|  |                 at: number | ||||||
|  |               } = JSON.parse(val) | ||||||
|  |               const expired = new Date().getTime() > expireVal.at | ||||||
|  |               if (expired) this.redis?.hdel(expireVal.name, expireVal.key) | ||||||
|  |             } | ||||||
|  |           }) | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|  |     }, this._expireIntervalTimer) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async _checkReady(): Promise<void> { | ||||||
|  |     if (!this.ready) await this._redis | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async get(cacheName: string, key: string): Promise<string | undefined> { | ||||||
|  |     await this._checkReady() | ||||||
|  |     const cache = await this.redis?.hget(cacheName, key) | ||||||
|  |     if (cache === undefined) return | ||||||
|  |     try { | ||||||
|  |       return JSON.parse(cache) | ||||||
|  |     } catch (e) { | ||||||
|  |       return cache | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async set( | ||||||
|  |     cacheName: string, | ||||||
|  |     key: string, | ||||||
|  |     value: any, | ||||||
|  |     expire?: number | ||||||
|  |   ): Promise<number | undefined> { | ||||||
|  |     await this._checkReady() | ||||||
|  |     const result = await this.redis?.hset( | ||||||
|  |       cacheName, | ||||||
|  |       key, | ||||||
|  |       typeof value === 'object' ? JSON.stringify(value) : value | ||||||
|  |     ) | ||||||
|  |     if (expire !== undefined) { | ||||||
|  |       await this.redis?.hset( | ||||||
|  |         `${cacheName}:expires`, | ||||||
|  |         key, | ||||||
|  |         JSON.stringify({ | ||||||
|  |           name: cacheName, | ||||||
|  |           key, | ||||||
|  |           at: new Date().getTime() + expire | ||||||
|  |         }) | ||||||
|  |       ) | ||||||
|  |     } | ||||||
|  |     return result | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async delete(cacheName: string, key: string): Promise<boolean> { | ||||||
|  |     await this._checkReady() | ||||||
|  |     const exists = await this.redis?.hexists(cacheName, key) | ||||||
|  |     if (exists === 0) return false | ||||||
|  |     await this.redis?.hdel(cacheName, key) | ||||||
|  |     return true | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async array(cacheName: string): Promise<any[] | undefined> { | ||||||
|  |     await this._checkReady() | ||||||
|  |     const data = await this.redis?.hvals(cacheName) | ||||||
|  |     return data?.map((e: string) => JSON.parse(e)) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async deleteCache(cacheName: string): Promise<boolean> { | ||||||
|  |     await this._checkReady() | ||||||
|  |     return (await this.redis?.del(cacheName)) !== 0 | ||||||
|  |   } | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue