typescriptでmemcachedのクライアントを作った

nodeからmemcachedを使いたくなったんだけど,あまり良いクライアントがない.

というわけで自作した.

github.com

nodeでのmemcached事情

一番メジャーそうな

github.com

これは,DefinitelyTypedにd.tsファイルは存在するけど,そもそもcallback関数を受け取る形で,もういい加減Promiseを返してほしいと思う. Promiseにしてくれというissueは存在していて,どうやら開発している痕跡はあるのだけれど,どうもアップデートされてこない. というか最終リリースが2016年なので,これ当分更新されないのでは……

しかもメンテナの募集までされている……のだが,そのメンテナがnpmにアクセスできないようで……

Maintainers wanted! · Issue #318 · 3rd-Eden/memcached · GitHub

これは未来がない…….

github.com

こちらはPromiseを返してくれてよいのだけど,いかんせんtypescriptに対応していない. DefinitelyTypedにもないし,d.tsファイルも配信していない.

というわけで,

  • typescriptで書かれている or d.tsファイルが存在する
  • callbackではなくPromiseを返す

memcachedクライアントがほしいのだけれど,存在しない気がしたので自作した.

github.com

使い方

$ yarn add memcached-client

でインストールできる.

import Memcached, { Metadata } from 'memcached-client'

const client = new Memcached('127.0.0.1', 11211)

const example = async (client: Memcached) => {
  const connection = await client.connect()
  const code = await connection.set('my-key', 'my-value', false, 0)
  console.log(code) // => STORED
  const data: { [key: string]: Metadata } = await connection.get('my-key')
  if (data['my-key']) {
    console.log(data['my-key'].value) // => my-value
  }
  await connection.close()
}

使い方はこんな感じ.

getのときの戻り値だけ少し複雑で,Metadata という独自の型を,ハッシュの中に埋めて返す. memcachedは,getに関しては複数のキーを同時指定することができる.そうすると,一度に複数のvalueが帰ってくることがあって,これをどう返すかが悩みどころでこういう形になっている. 配列で返しても良いのだが,key-value storeであることを考えると,keyとvalueをセットにして返すべきだろうと思ってこういう形になっている.

現状実装されている機能と今後

READMEにもRoadmapを載せているけど,そもそも現状このクライアントは,get/set/deleteメソッドしか持っていない. ただし,memcached側としては,この他にもいくつかメソッドが用意されており,それらにはまだ対応していないということになる.

一応自分で使う範囲では,get/set/deleteだけできれば事足りるので,とりあえずこの状態で出しているが,そのうち機能は充実してくると思う.

とりあえず直近はこの,未対応メソッドに対応していくことが優先されるので,もうちょっと開発しようかと思う.