fresh v1.2

fresh v1.2がリリースされました。

変更内容について以下のページにまとめたため、よろしければ参照いただければと思います。

Deno v1.34.3

Deno v1.34.3がリリースされました。

Deno KVにキューが実装

Deno.KvenqueuelistenQueueメソッドが追加されています。

const kv = await Deno.openKv(":memory:");

// メッセージを追加します。
const res = await kv.enqueue({ id: 1, payload: "foo" });
assert(res.ok);

let message;
// キューを購読します
const listenPromise = kv.listenQueue((_message) => {
  message = _message;
});

kv.close();
await listenPromise; // closeするとresolveされます

console.info(message);
// Output: { id: 1, payload: "foo" }

Deno.Kv.enqueueには以下のオプションを指定できます。

オプション説明
keysIfUndeliveredメッセージの処理に失敗した際にKVに設定したいエントリを指定できます
delay配送までの遅延時間を指定できます(最大で1週間まで指定できて、デフォルトは0です)

listenQueueに渡したコールバックが失敗した際は、自動的にリトライされます。(リトライ回数は最大で5回のようです)

リトライが全て失敗した際は、上記のkeysIfUndeliveredで指定したエントリがKVに保存されます。

const kv = await Deno.openKv(":memory:");

const listenPromise = kv.listenQueue((_) => {
  // 意図的に失敗させています
  throw new Error();
});

const message = { id: 1, payload: "foo"};
const res = await kv.enqueue(message, {
  keysIfUndelivered: [["dead_letter_queue", message.id]],
});
assert(res.ok);

// リトライがすべて失敗するまで待機します...
await new Promise((ok) => setTimeout(ok, 100_000));

const res2 = await kv.get(["dead_letter_queue", message.id]);
console.info(res2.value);
// Output: { id: 1, payload: "foo" }

kv.close();
await listenPromise;

Node.js互換性の改善

パフォーマンス改善:

node_modules内のファイルの読み取り権限を確認する際に発行されているrealpathシスコールの結果がキャッシュされるようになりました。

場合によっては40%近くのオーバーヘッドの削減も見られるようです。


Node.js組み込みモジュール:

  • node:https: createServerが実装されました
  • node:http: Upgradeヘッダーのハンドリングが追加されました。
    • 現状はwebsocketのみがサポートされています。
    • npm:puppeteernpm:discordを動かしたいのがモチベーションのようです。
  • node:worker_threads: 対象ファイルのモジュール形式(CJSまたはESM)の判定時に、 package.json"type"も参照されるように改善されました。

バグ修正:

  • npm:URLに不正な形式のパッケージ名が指定されるとDenoがクラッシュする問題が修正されています。
  • deno compileを実行した際に、使っているnpmパッケージによってはバイナリの中から欠損してしまうことがある問題が修正されています。

deno lsp

  • deno.jsonexcludeで指定されたファイルはdeno lspによって事前読み込みされないように修正されました。
  • deno.jsonにImport Maps(importsフィールド)を埋め込んだ際に、--watchdeno lspでうまく反映されない問題が修正されました。

Deno.serve()

Deno.serve()onListenhostnameが渡されるようになりました。

deno_std v0.192.0

deno_std v0.192.0がリリースされました。

std/semverモジュールが書き直されました (破壊的変更)

主な変更点:

  • SemVerclassからinterfaceへ変更されました。
  • これに合わせて、SemVerを不変なオブジェクトとして扱うように実装が修正されています。
  • 各種APIの入力としてstringを受け取れるようオーバーロードが定義されていますが、この形式が非推奨になりました (今後は、stringではなくSemVerオブジェクトを渡すことが推奨されるようです)
  • 各APIごとに単一のファイルが作成されました (例: std/semver/gt.ts, std/semver/parse.ts)

std/testing/snapshot.ts

--updateの実行時に削除されたスナップショットがあった場合、それらがログで報告されるように改善されました。

std/testing/time.ts

FakeDateの内部で本物のDateオブジェクトが使われるように修正されました。

これにより、通常のDateオブジェクトとの互換性の向上が期待されます。

std/yaml/parse.ts

parse()に空のYAMLが与えられた際に、undefinedではなくnullが返却されるように修正されました。