67 lines
1.6 KiB
TypeScript
67 lines
1.6 KiB
TypeScript
import * as winston from 'winston'
|
|
import Memcached = require('memcached')
|
|
|
|
import type { Callback } from 'src/types/callback'
|
|
import type { MemcachedStoreConfig } from 'src/types/config'
|
|
import { Store } from '.'
|
|
|
|
class MemcachedDocumentStore extends Store {
|
|
client: Memcached
|
|
|
|
// Create a new store with options
|
|
constructor(options: MemcachedStoreConfig) {
|
|
super(options)
|
|
const host = options.host || '127.0.0.1'
|
|
const port = options.port || 11211
|
|
const url = `${host}:${port}`
|
|
|
|
// Create a connection
|
|
this.client = new Memcached(url)
|
|
winston.info(`connecting to memcached on ${url}`)
|
|
this.client.on('failure', (error: Memcached.IssueData) => {
|
|
winston.info('error connecting to memcached', { error })
|
|
})
|
|
}
|
|
|
|
// Get a file from a key
|
|
get = (
|
|
key: string,
|
|
callback: Callback,
|
|
skipExpire?: boolean | undefined
|
|
): void => {
|
|
this.client?.get(key, (error, data: string) => {
|
|
const value = error ? false : data
|
|
|
|
callback(value as string)
|
|
|
|
// Update the key so that the expiration is pushed forward
|
|
if (value && !skipExpire) {
|
|
this.set(
|
|
key,
|
|
data,
|
|
updateSucceeded => {
|
|
if (!updateSucceeded) {
|
|
winston.error('failed to update expiration on GET', { key })
|
|
}
|
|
},
|
|
skipExpire
|
|
)
|
|
}
|
|
})
|
|
}
|
|
|
|
// Save file in a key
|
|
set = (
|
|
key: string,
|
|
data: string,
|
|
callback: Callback,
|
|
skipExpire?: boolean | undefined
|
|
): void => {
|
|
this.client?.set(key, data, skipExpire ? 0 : this.expire || 0, error => {
|
|
callback(!error)
|
|
})
|
|
}
|
|
}
|
|
|
|
export default MemcachedDocumentStore
|