浏览代码

update deno and oak versions and using postgresjs (#9877)

Co-authored-by: = <=>
Panov Yury 2 月之前
父节点
当前提交
984876a50e

+ 11 - 11
frameworks/TypeScript/oak/README.md

@@ -2,13 +2,13 @@
 
 ### Test Type Implementation Source Code
 
-- [PLAINTEXT](src/routes.ts#L15)
-- [JSON](src/routes.ts#L16)
-- [DB](src/routes.ts#L17)
-- [QUERY](src/routes.ts#L24)
-- [UPDATE](src/routes.ts#L37)
-- [FORTUNES](src/routes.ts#L53)
-- [CACHED QUERY](src/routes.ts#L67)
+- [PLAINTEXT](src/routes.ts#L18)
+- [JSON](src/routes.ts#L19)
+- [DB](src/routes.ts#L25)
+- [QUERY](src/routes.ts#L29)
+- [UPDATE](src/routes.ts#L39)
+- [FORTUNES](src/routes.ts#L59)
+- [CACHED QUERY](src/routes.ts#L73)
 
 ## Important Libraries
 
@@ -16,7 +16,7 @@ The tests were run with:
 
 - [deno](https://deno.land)
 - [oak](https://deno.land/x/oak/)
-- [cotton](https://deno.land/x/cotton/)
+- [Postgres.js](https://github.com/porsager/postgres/)
 
 ## Test URLs
 
@@ -34,11 +34,11 @@ http://localhost:8080/db
 
 ### QUERY
 
-http://localhost:8080/query?q=
+http://localhost:8080/queries?q=
 
 ### UPDATE
 
-http://localhost:8080/update?q=
+http://localhost:8080/updates?q=
 
 ### FORTUNES
 
@@ -46,4 +46,4 @@ http://localhost:8080/fortunes
 
 ### CACHED QUERY
 
-http://localhost:8080/cached_query?q=
+http://localhost:8080/cached_queries?q=

+ 28 - 8
frameworks/TypeScript/oak/benchmark_config.json

@@ -3,6 +3,27 @@
   "tests": [
     {
       "default": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "None",
+        "framework": "oak",
+        "language": "TypeScript",
+        "flavor": "deno",
+        "orm": "None",
+        "platform": "deno",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "oak",
+        "notes": "",
+        "versus": "nodejs"
+      }
+    },
+    {
+      "postgresjs": {
         "json_url": "/json",
         "plaintext_url": "/plaintext",
         "db_url": "/db",
@@ -12,20 +33,19 @@
         "cached_query_url": "/cached_queries?q=",
         "port": 8080,
         "approach": "Realistic",
-        "classification": "Platform",
+        "classification": "Micro",
         "database": "postgres",
-        "framework": "None",
-        "language": "Typescript",
+        "database_os": "Linux",
+        "framework": "oak",
+        "language": "TypeScript",
         "flavor": "deno",
-        "orm": "Micro",
+        "orm": "Raw",
         "platform": "deno",
         "webserver": "None",
         "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "oak",
+        "display_name": "oak [postgresjs]",
         "notes": "",
-        "versus": "nodejs",
-        "tags": ["broken"]
+        "versus": "nodejs"
       }
     }
   ]

+ 8 - 0
frameworks/TypeScript/oak/deno.json

@@ -0,0 +1,8 @@
+{
+  "imports": {
+    "oak": "jsr:@oak/[email protected]",
+    "postgres": "https://deno.land/x/[email protected]/mod.js",
+    "lru-cache": "jsr:@std/[email protected]/lru-cache",
+    "html": "https://deno.land/x/[email protected]/mod.ts"
+  }
+}

+ 391 - 0
frameworks/TypeScript/oak/deno.lock

@@ -0,0 +1,391 @@
+{
+  "version": "4",
+  "specifiers": {
+    "jsr:@oak/commons@1": "1.0.1",
+    "jsr:@oak/[email protected]": "17.1.4",
+    "jsr:@std/assert@1": "1.0.13",
+    "jsr:@std/bytes@1": "1.0.5",
+    "jsr:@std/[email protected]": "0.2.0",
+    "jsr:@std/crypto@1": "1.0.4",
+    "jsr:@std/encoding@1": "1.0.10",
+    "jsr:@std/encoding@^1.0.10": "1.0.10",
+    "jsr:@std/http@1": "1.0.15",
+    "jsr:@std/media-types@1": "1.1.0",
+    "jsr:@std/path@1": "1.0.9",
+    "npm:path-to-regexp@^6.3.0": "6.3.0"
+  },
+  "jsr": {
+    "@oak/[email protected]": {
+      "integrity": "889ff210f0b4292591721be07244ecb1b5c118742f5273c70cf30d7cd4184d0c",
+      "dependencies": [
+        "jsr:@std/assert",
+        "jsr:@std/bytes",
+        "jsr:@std/crypto",
+        "jsr:@std/encoding@1",
+        "jsr:@std/http",
+        "jsr:@std/media-types"
+      ]
+    },
+    "@oak/[email protected]": {
+      "integrity": "60530b582bf276ff741e39cc664026781aa08dd5f2bc5134d756cc427bf2c13e",
+      "dependencies": [
+        "jsr:@oak/commons",
+        "jsr:@std/assert",
+        "jsr:@std/bytes",
+        "jsr:@std/http",
+        "jsr:@std/media-types",
+        "jsr:@std/path",
+        "npm:path-to-regexp"
+      ]
+    },
+    "@std/[email protected]": {
+      "integrity": "ae0d31e41919b12c656c742b22522c32fb26ed0cba32975cb0de2a273cb68b29"
+    },
+    "@std/[email protected]": {
+      "integrity": "4465dd739d7963d964c809202ebea6d5c6b8e3829ef25c6a224290fbb8a1021e"
+    },
+    "@std/[email protected]": {
+      "integrity": "63a2ccd5a9e7c03e430f7d34dfcfd0d0cfc90731a1eaf8208f4c66e418fc3035"
+    },
+    "@std/[email protected]": {
+      "integrity": "cee245c453bd5366207f4d8aa25ea3e9c86cecad2be3fefcaa6cb17203d79340"
+    },
+    "@std/[email protected]": {
+      "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1"
+    },
+    "@std/[email protected]": {
+      "integrity": "435a4934b4e196e82a8233f724da525f7b7112f3566502f28815e94764c19159",
+      "dependencies": [
+        "jsr:@std/encoding@^1.0.10"
+      ]
+    },
+    "@std/[email protected]": {
+      "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4"
+    },
+    "@std/[email protected]": {
+      "integrity": "260a49f11edd3db93dd38350bf9cd1b4d1366afa98e81b86167b4e3dd750129e"
+    }
+  },
+  "npm": {
+    "[email protected]": {
+      "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="
+    }
+  },
+  "remote": {
+    "https://deno.land/[email protected]/_deno_unstable.ts": "23a1a36928f1b6d3b0170aaa67de09af12aa998525f608ff7331b9fb364cbde6",
+    "https://deno.land/[email protected]/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
+    "https://deno.land/[email protected]/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617",
+    "https://deno.land/[email protected]/_wasm_crypto/crypto.mjs": "3b383eb715e8bfe61b4450ef0644b2653429c88d494807c86c5235979f62e56b",
+    "https://deno.land/[email protected]/_wasm_crypto/crypto.wasm.mjs": "0ad9ecc0d03ca8a083d9109db22e7507f019f63cf55b82ea618ab58855617577",
+    "https://deno.land/[email protected]/_wasm_crypto/mod.ts": "30a93c8b6b6c5b269e96a3e95d2c045d86a496814a8737443b77cad941d6a0b5",
+    "https://deno.land/[email protected]/async/abortable.ts": "87aa7230be8360c24ad437212311c9e8d4328854baec27b4c7abb26e85515c06",
+    "https://deno.land/[email protected]/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0",
+    "https://deno.land/[email protected]/async/debounce.ts": "564273ef242bcfcda19a439132f940db8694173abffc159ea34f07d18fc42620",
+    "https://deno.land/[email protected]/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a",
+    "https://deno.land/[email protected]/async/delay.ts": "cbbdf1c87d1aed8edc7bae13592fb3e27e3106e0748f089c263390d4f49e5f6c",
+    "https://deno.land/[email protected]/async/mod.ts": "2240c6841157738414331f47dee09bb8c0482c5b1980b6e3234dd03515c8132f",
+    "https://deno.land/[email protected]/async/mux_async_iterator.ts": "f4d1d259b0c694d381770ddaaa4b799a94843eba80c17f4a2ec2949168e52d1e",
+    "https://deno.land/[email protected]/async/pool.ts": "97b0dd27c69544e374df857a40902e74e39532f226005543eabacb551e277082",
+    "https://deno.land/[email protected]/async/tee.ts": "1341feb1f5b1a96f8628d0f8fc07d8c43d3813423f18a63bf1b4785568d21b1f",
+    "https://deno.land/[email protected]/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d",
+    "https://deno.land/[email protected]/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9",
+    "https://deno.land/[email protected]/bytes/mod.ts": "d3b455c0dbd4804644159d1e25946ade5ee385d2359894de49e2c6101b18b7a9",
+    "https://deno.land/[email protected]/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f",
+    "https://deno.land/[email protected]/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130",
+    "https://deno.land/[email protected]/encoding/hex.ts": "7f023e1e51cfd6b189682e602e8640939e7be71a300a2fcf3daf8f84dc609bbc",
+    "https://deno.land/[email protected]/flags/mod.ts": "430cf2d1c26e00286373b2647ebdca637f7558505e88e9c108a4742cd184c916",
+    "https://deno.land/[email protected]/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37",
+    "https://deno.land/[email protected]/fmt/printf.ts": "e2c0f72146aed1efecf0c39ab928b26ae493a2278f670a871a0fbdcf36ff3379",
+    "https://deno.land/[email protected]/fs/eol.ts": "b92f0b88036de507e7e6fbedbe8f666835ea9dcbf5ac85917fa1fadc919f83a5",
+    "https://deno.land/[email protected]/fs/exists.ts": "cb734d872f8554ea40b8bff77ad33d4143c1187eac621a55bf37781a43c56f6d",
+    "https://deno.land/[email protected]/hash/sha256.ts": "803846c7a5a8a5a97f31defeb37d72f519086c880837129934f5d6f72102a8e8",
+    "https://deno.land/[email protected]/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b",
+    "https://deno.land/[email protected]/node/_buffer.mjs": "f4a7df481d4eed06dc0151b833177d8ef74fc3a96dd4d2b073e690b6ced9474d",
+    "https://deno.land/[email protected]/node/_core.ts": "568d277be2e086af996cbdd599fec569f5280e9a494335ca23ad392b130d7bb9",
+    "https://deno.land/[email protected]/node/_crypto/constants.ts": "49011c87be4e45407ef5e99e96bde3f08656ebd8e6dfc99048c703dd0ce53952",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/asn1.js/base/buffer.js": "73beb8294eb29bd61458bbaaeeb51dfad4ec9c9868a62207a061d908f1637261",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/asn1.js/base/node.js": "4b777980d2a23088698fd2ff065bb311a2c713497d359e674cb6ef6baf267a0f",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/asn1.js/base/reporter.js": "8e4886e8ae311c9a92caf58bbbd8670326ceeae97430f4884e558e4acf8e8598",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/asn1.js/constants/der.js": "354b255479bff22a31d25bf08b217a295071700e37d0991cc05cac9f95e5e7ca",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/asn1.js/decoders/der.js": "c6faf66761daa43fbf79221308443893587c317774047b508a04c570713b76fb",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/asn1.js/decoders/pem.js": "8316ef7ce2ce478bc3dc1e9df1b75225d1eb8fb5d1378f8adf0cf19ecea5b501",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/asn1.js/encoders/der.js": "408336c88d17c5605ea64081261cf42267d8f9fda90098cb560aa6635bb00877",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/asn1.js/encoders/pem.js": "42a00c925b68c0858d6de0ba41ab89935b39fae9117bbf72a9abb2f4b755a2e7",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/asn1.js/mod.js": "7b78859707be10a0a1e4faccdd28cd5a4f71ad74a3e7bebda030757da97cd232",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/bn.js/bn.js": "abd1badd659fd0ae54e6a421a573a25aef4e795edc392178360cf716b144286d",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/aes.js": "1cf4c354c5bb341ffc9ab7207f471229835b021947225bce2e1642f26643847a",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/auth_cipher.js": "19b4dbb903e8406eb733176e6318d5e1a3bd382b67b72f7cf8e1c46cc6321ba4",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/decrypter.js": "05c1676942fd8e95837115bc2d1371bcf62e9bf19f6c3348870961fc64ddad0b",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/encrypter.js": "93ec98ab26fbeb5969eae2943e42fb66780f377b9b0ff0ecc32a9ed11201b142",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/ghash.js": "667b64845764a84f0096ef8cf7debed1a5f15ac9af26b379848237be57da399a",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/incr32.js": "4a7f0107753e4390b4ccc4dbd5200c5527d43f894f768e131903df30a09dfd67",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/mod.js": "d8eb88e7a317467831473621f32e60d7db9d981f6a2ae45d2fb2af170eab2d22",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/modes/cbc.js": "9790799cff181a074686c885708cb8eb473aeb3c86ff2e8d0ff911ae6c1e4431",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/modes/cfb.js": "a4e36ede6f26d8559d8f0528a134592761c706145a641bd9ad1100763e831cdb",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/modes/cfb1.js": "c6372f4973a68ca742682e81d1165e8869aaabf0091a8b963d4d60e5ee8e6f6a",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/modes/cfb8.js": "bd29eebb89199b056ff2441f7fb5e0300f458e13dcaaddbb8bc00cbdb199db67",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/modes/ctr.js": "9c2cbac1fc8f9b58334faacb98e6c57e8c3712f673ea4cf2d528a2894998ab2f",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/modes/ecb.js": "9629d193433688f0cfc432eca52838db0fb28d9eb4f45563df952bde50b59763",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/modes/mod.js": "7d8516ef8a20565539eb17cad5bb70add02ac06d1891e8f47cb981c22821787e",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/modes/ofb.js": "c23abaa6f1ec5343e9d7ba61d702acb3d81a0bd3d34dd2004e36975dc043d6ff",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/stream_cipher.js": "a533a03a2214c6b5934ce85a59eb1e04239fd6f429017c7ca3c443ec7e07e68f",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_aes/xor.ts": "4417711c026eb9a07475067cd31fa601e88c2d6ababd606d33d1e74da6fcfd09",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/browserify_rsa.js": "de8c98d2379a70d8c239b4886e2b3a11c7204eec39ae6b65d978d0d516ee6b08",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/cipher_base.js": "f565ad9daf3b3dd3b68381bed848da94fb093a9e4e5a48c92f47e26cc229df39",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/evp_bytes_to_key.ts": "8bd9fa445576b3e39586bdbef7c907f1dfda201bf22602d2ca1c6d760366311e",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/parse_asn1/asn1.js": "4f33b0197ffbe9cff62e5bad266e6b40d55874ea653552bb32ed251ad091f70a",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/parse_asn1/certificate.js": "aab306870830a81ad188db8fa8e037d7f5dd6c5abdabbd9739558245d1a12224",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/parse_asn1/fix_proc.js": "af3052b76f441878e102ffcfc7420692e65777af765e96f786310ae1acf7f76a",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/parse_asn1/mod.js": "e923a13b27089a99eeb578d2ffb9b4cfe8ce690918fec05d0024fa126f3e1ce3",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/public_encrypt/mgf.js": "5b81dc1680829b564fc5a00b842fb9c88916e4639b4fa27fa8bb6b759d272371",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/public_encrypt/mod.js": "eb8b64d7a58ee3823c1b642e799cc7ed1257d99f4d4aefa2b4796dd112ec094a",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/public_encrypt/private_decrypt.js": "0050df879f7c1338132c45056835f64e32140e2a2d5d03c1366ccce64855f632",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/public_encrypt/public_encrypt.js": "0132cb4fb8f72593278474884195b9c52b4e9ba33d8ddd22116d07a07f47005a",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/public_encrypt/with_public.js": "7373dac9b53b8331ccf3521c854a131dcb304a2e4d34cd116649118f7919ed0c",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/public_encrypt/xor.js": "900c6fc8b95e1861d796193c41988f5f70a09c7059e42887a243d0113ecaf0fd",
+    "https://deno.land/[email protected]/node/_crypto/crypto_browserify/randombytes.ts": "f465cd8e114a3c110297e0143445b12125d729b25bada5bd88d5b30cf612d7dd",
+    "https://deno.land/[email protected]/node/_crypto/hash.ts": "6a84a079412d09ead27b900590f0bede9924bc7ce522b8b7d55183a2aaf63a68",
+    "https://deno.land/[email protected]/node/_crypto/pbkdf2.ts": "00af38578729b3060371dfee70dae502a5848b4cc4787c48f634195cab1ce89a",
+    "https://deno.land/[email protected]/node/_crypto/randomBytes.ts": "04e276bcbfa55b3502c7169deab3f2bf58bbc5e9727634f8a150eff734338e90",
+    "https://deno.land/[email protected]/node/_crypto/randomFill.ts": "019ff2a8330c3ede6e65af28c5a8e3dee9d404975749c8dadf6ba11ccc28528e",
+    "https://deno.land/[email protected]/node/_crypto/randomInt.ts": "2db981c2baf4ddac07b6da71f90677f4acf4dc2d93f351563fdd084d645b8413",
+    "https://deno.land/[email protected]/node/_crypto/scrypt.ts": "caf07a6b8afa6ac582f80f99ed7dc7fefd5476fcd2aad771b8440e5b883d6d70",
+    "https://deno.land/[email protected]/node/_crypto/timingSafeEqual.ts": "4a4ef17e482889d9d82138d5ffc0e787c32c04b1f12b28d076b1a69ceca46af1",
+    "https://deno.land/[email protected]/node/_crypto/types.ts": "d3fae758c5b62f63d8126c76eec31a5559a2f34305defb5fe2a7d9034057ff54",
+    "https://deno.land/[email protected]/node/_dns/_utils.ts": "42494c8b8fa1c13eb134c5696744f77197717fa857e4d05147f2395a739b0a40",
+    "https://deno.land/[email protected]/node/_events.mjs": "d7d56df4b9f69e445064bad5e5558978fb18c18c439bbb62fa13149b40d7fb99",
+    "https://deno.land/[email protected]/node/_fixed_queue.ts": "455b3c484de48e810b13bdf95cd1658ecb1ba6bcb8b9315ffe994efcde3ba5f5",
+    "https://deno.land/[email protected]/node/_fs/_fs_access.ts": "0700488320d37208d000b94767ab37208d469550767edab69b65b09a330f245d",
+    "https://deno.land/[email protected]/node/_fs/_fs_appendFile.ts": "5dca59d7f2ec33316d75da3d6a12d39f5c35b429bddf83f4b2c030b3a289d4b3",
+    "https://deno.land/[email protected]/node/_fs/_fs_chmod.ts": "8fc25677b82a2643686e6f8270a8f1bee87dd60986334591450699e199dac7d5",
+    "https://deno.land/[email protected]/node/_fs/_fs_chown.ts": "57858c54d376648fc3c8cf5a8ad4f7f19fb153b75fac3ed41df0332d757e7de9",
+    "https://deno.land/[email protected]/node/_fs/_fs_close.ts": "785a9d1a6d615e8aa9f5a4ac50c9a131931f8b0e17b3d4671cd1fd25a5c10f2b",
+    "https://deno.land/[email protected]/node/_fs/_fs_common.ts": "6a373d1583d9ec5cc7a8ff1072d77dc999e35282a320b7477038a2b209c304d3",
+    "https://deno.land/[email protected]/node/_fs/_fs_constants.ts": "5c20b190fc6b7cfdaf12a30ba545fc787db2c7bbe87ed5b890da99578116a339",
+    "https://deno.land/[email protected]/node/_fs/_fs_copy.ts": "675eb02a2dfc20dab1186bf6ed0a33b1abae656f440bc0a3ce74f385e0052eef",
+    "https://deno.land/[email protected]/node/_fs/_fs_dir.ts": "8a05f72e32dd568b41ef45f8f55f1f54e9a306a7588475fa7014289cd12872d9",
+    "https://deno.land/[email protected]/node/_fs/_fs_dirent.ts": "649c0a794e7b8d930cdd7e6a168b404aa0448bf784e0cfbe1bd6d25b99052273",
+    "https://deno.land/[email protected]/node/_fs/_fs_exists.ts": "83e9ca6ea1ab3c6c7c3fc45f3c1287ee88839f08140ac11056441537450055bb",
+    "https://deno.land/[email protected]/node/_fs/_fs_fdatasync.ts": "bbd078fea6c62c64d898101d697aefbfbb722797a75e328a82c2a4f2e7eb963d",
+    "https://deno.land/[email protected]/node/_fs/_fs_fstat.ts": "559ff6ff094337db37b0f3108aeaecf42672795af45b206adbd90105afebf9c6",
+    "https://deno.land/[email protected]/node/_fs/_fs_fsync.ts": "590be69ce5363dd4f8867f244cfabe8df89d40f86bbbe44fd00d69411d0b798e",
+    "https://deno.land/[email protected]/node/_fs/_fs_ftruncate.ts": "8eb2a9fcf026bd9b85dc07a22bc452c48db4be05ab83f5f2b6a0549e15c1f75f",
+    "https://deno.land/[email protected]/node/_fs/_fs_futimes.ts": "c753cb9e9f129a11d1110ed43905b8966ac2a1d362ed69d5a34bb44513b00082",
+    "https://deno.land/[email protected]/node/_fs/_fs_link.ts": "3f9ccce31c2e56284fbcf2c65ec2e6fed1d9e67a9997410223486ac5092888e3",
+    "https://deno.land/[email protected]/node/_fs/_fs_lstat.ts": "571cea559d270e3b2e7fc585b0eb051899f6d0e54b1786f5e2cee3e9f71e7f27",
+    "https://deno.land/[email protected]/node/_fs/_fs_mkdir.ts": "68421a23b6d3c2d0142a6d0b3ccdd87903f9c8f98d6754aba554ab4c6b435bb8",
+    "https://deno.land/[email protected]/node/_fs/_fs_mkdtemp.ts": "86eaec96c63ea178c749fa856115a345e9797baecad22297b9ef98e3d62b90e2",
+    "https://deno.land/[email protected]/node/_fs/_fs_open.ts": "b1ca72addd2723b2a5a876378e72609fbe168adad2006f5d7b4f1868beef65ca",
+    "https://deno.land/[email protected]/node/_fs/_fs_read.ts": "3b4ef96aad20f3f29a859125ebeac8c9461574743f70c2a7ef301b8505f7d036",
+    "https://deno.land/[email protected]/node/_fs/_fs_readFile.ts": "3eae6c930e08c1279d400c0f5a008e6d96949ff3a4f5bf7d43e1b94b94ce3854",
+    "https://deno.land/[email protected]/node/_fs/_fs_readdir.ts": "a546f01387b7c49ddc1bd78d0e123a9668c710c56cffb4d9577ef46703cab463",
+    "https://deno.land/[email protected]/node/_fs/_fs_readlink.ts": "00553cd155f3bea565ffe43d7f0c10d75e895455562e1e8ea153e8f4e7ac04c7",
+    "https://deno.land/[email protected]/node/_fs/_fs_realpath.ts": "3ec236e4ad3c171203043422939973b6a948200ec4802425db41fa60c860dde9",
+    "https://deno.land/[email protected]/node/_fs/_fs_rename.ts": "3be71e8f43275c349b7abb9343b6e6764df09fabcbd2d316f8ac170ea556c645",
+    "https://deno.land/[email protected]/node/_fs/_fs_rm.ts": "a9328f99d925d7c74d31361d466ca33475aa7c6d1d6f037a49ce1ed996f0a0b4",
+    "https://deno.land/[email protected]/node/_fs/_fs_rmdir.ts": "b74007891357e709b37e6721eb355a1c4f25575995bb7c961a3c40f03ebc624c",
+    "https://deno.land/[email protected]/node/_fs/_fs_stat.ts": "bd47ce0bfc2b867392abc6ec95878ab4f6dddb94af73903d6fa1a02ba3e26af8",
+    "https://deno.land/[email protected]/node/_fs/_fs_streams.ts": "0e54bd4e41b462a701d6729ea17db01624aa48109e402fea8eecf13be324cf16",
+    "https://deno.land/[email protected]/node/_fs/_fs_symlink.ts": "0bddc37c5092f847634bd41cee0b643b9c03fc541c0e635cf35da1fcb4d0f7fa",
+    "https://deno.land/[email protected]/node/_fs/_fs_truncate.ts": "e2d380f7a81f69c4d4db30c442558ba8d8dea561e5097af41022bb5724e494e5",
+    "https://deno.land/[email protected]/node/_fs/_fs_unlink.ts": "c537ca98e507972d65f0b113a179b5f5083f0da3e6f9fae29895fd2a9660c18a",
+    "https://deno.land/[email protected]/node/_fs/_fs_utimes.ts": "c4446b7e39bf6977eca4364360501a97b96db9ea41e0cdf49abddab73481a175",
+    "https://deno.land/[email protected]/node/_fs/_fs_watch.ts": "2338de777458021d39cb9f0a5f3ea1bd9109a7ca2c2ad6ec41029df1753838f8",
+    "https://deno.land/[email protected]/node/_fs/_fs_write.mjs": "8c130b8b9522e1e4b08e687eb27939240260c115fda1e38e99c57b4f3af6481f",
+    "https://deno.land/[email protected]/node/_fs/_fs_writeFile.ts": "79d176021c8ceae0d956763a33834166ebc3f1691ed9219a21674b2374f115c3",
+    "https://deno.land/[email protected]/node/_fs/_fs_writev.mjs": "274df0a109010862c8f8b320dc7784de9bd9425fe2a6afd05f1f06f547a25cba",
+    "https://deno.land/[email protected]/node/_next_tick.ts": "64c361f6bca21df2a72dd77b84bd49d80d97a694dd3080703bc78f52146351d1",
+    "https://deno.land/[email protected]/node/_options.ts": "27f3c1269a700d330cc046cf748aa9178b8fc39d1473de625688e07cb0eb9d28",
+    "https://deno.land/[email protected]/node/_process/exiting.ts": "bc9694769139ffc596f962087155a8bfef10101d03423b9dcbc51ce6e1f88fce",
+    "https://deno.land/[email protected]/node/_process/process.ts": "84644b184053835670f79652d1ce3312c9ad079c211e6207ebefeedf159352a3",
+    "https://deno.land/[email protected]/node/_process/stdio.mjs": "971c3b086040d8521562155db13f22f9971d5c42c852b2081d4d2f0d8b6ab6bd",
+    "https://deno.land/[email protected]/node/_process/streams.mjs": "555062e177ad05f887147651fdda25fa55098475fcf142c8d162b8fe14097bbb",
+    "https://deno.land/[email protected]/node/_stream.mjs": "07f6cbabaad0382fb4b9a25e70ac3093a44022b859247f64726746e6373f1c91",
+    "https://deno.land/[email protected]/node/_util/_util_callbackify.ts": "79928ad80df3e469f7dcdb198118a7436d18a9f6c08bd7a4382332ad25a718cf",
+    "https://deno.land/[email protected]/node/_utils.ts": "c2c352e83c4c96f5ff994b1c8246bff2abcb21bfc3f1c06162cb3af1d201e615",
+    "https://deno.land/[email protected]/node/buffer.ts": "fbecbf3f237fa49bec96e97ecf56a7b92d48037b3d11219288e68943cc921600",
+    "https://deno.land/[email protected]/node/crypto.ts": "fffbc3fc3dcc16ea986d3e89eed5f70db7dfef2c18d1205a8c8fe5327ee0192d",
+    "https://deno.land/[email protected]/node/dns.ts": "ae2abd1bc8ac79543fe4d702f2aa3607101dc788b6eeba06e06436cb42ee3779",
+    "https://deno.land/[email protected]/node/events.ts": "a1d40fc0dbccc944379ef968b80ea08f9fce579e88b5057fdb64e4f0812476dd",
+    "https://deno.land/[email protected]/node/fs.ts": "21a3189c460bd37ac3f6734e040587125b7c8435c0a9da4e6c57544a3aca81c2",
+    "https://deno.land/[email protected]/node/internal/assert.mjs": "118327c8866266534b30d3a36ad978204af7336dc2db3158b8167192918d4e06",
+    "https://deno.land/[email protected]/node/internal/async_hooks.ts": "8eca5b80f58ffb259e9b3a73536dc2fe2e67d07fd24bfe2aee325a4aa435edb3",
+    "https://deno.land/[email protected]/node/internal/blob.mjs": "52080b2f40b114203df67f8a6650f9fe3c653912b8b3ef2f31f029853df4db53",
+    "https://deno.land/[email protected]/node/internal/buffer.mjs": "6662fe7fe517329453545be34cea27a24f8ccd6d09afd4f609f11ade2b6dfca7",
+    "https://deno.land/[email protected]/node/internal/crypto/keys.ts": "16ce7b15a9fc5e4e3dee8fde75dae12f3d722558d5a1a6e65a9b4f86d64a21e9",
+    "https://deno.land/[email protected]/node/internal/crypto/util.mjs": "1de55a47fdbed6721b467a77ba48fdd1550c10b5eee77bbdb602eaffee365a5e",
+    "https://deno.land/[email protected]/node/internal/dtrace.ts": "50dd0e77b0269e47ff673bdb9ad0ef0ea3a3c53ac30c1695883ce4748e04ca14",
+    "https://deno.land/[email protected]/node/internal/error_codes.ts": "ac03c4eae33de3a69d6c98e8678003207eecf75a6900eb847e3fea3c8c9e6d8f",
+    "https://deno.land/[email protected]/node/internal/errors.ts": "25f91691225b001660e6e64745ecd336fbf562cf0185e8896ff013c2d0226794",
+    "https://deno.land/[email protected]/node/internal/fs/streams.ts": "c925db185efdf56c35cde8270c07d61698b80603a90e07caf1cb4ff80abf195b",
+    "https://deno.land/[email protected]/node/internal/fs/utils.mjs": "2a571ecbd169b444f07b7193306f108fdcb4bfd9b394b33716ad05edf30e899e",
+    "https://deno.land/[email protected]/node/internal/hide_stack_frames.ts": "a91962ec84610bc7ec86022c4593cdf688156a5910c07b5bcd71994225c13a03",
+    "https://deno.land/[email protected]/node/internal/idna.ts": "a8bdd28431f06630d8aad85d3cb8fd862459107af228c8805373ad2080f1c587",
+    "https://deno.land/[email protected]/node/internal/net.ts": "1239886cd2508a68624c2dae8abf895e8aa3bb15a748955349f9ac5539032238",
+    "https://deno.land/[email protected]/node/internal/normalize_encoding.mjs": "3779ec8a7adf5d963b0224f9b85d1bc974a2ec2db0e858396b5d3c2c92138a0a",
+    "https://deno.land/[email protected]/node/internal/process/per_thread.mjs": "a42b1dcfb009ad5039144a999a35a429e76112f9322febbe353eda9d1879d936",
+    "https://deno.land/[email protected]/node/internal/querystring.ts": "c3b23674a379f696e505606ddce9c6feabe9fc497b280c56705c340f4028fe74",
+    "https://deno.land/[email protected]/node/internal/stream_base_commons.ts": "934a9e69f46f2de644956edfa9fb040af7861e326fe5325dab38ef9caf2940bc",
+    "https://deno.land/[email protected]/node/internal/streams/_utils.ts": "77fceaa766679847e4d4c3c96b2573c00a790298d90551e8e4df1d5e0fdaad3b",
+    "https://deno.land/[email protected]/node/internal/streams/add-abort-signal.mjs": "5623b83fa64d439cc4a1f09ae47ec1db29512cc03479389614d8f62a37902f5e",
+    "https://deno.land/[email protected]/node/internal/streams/buffer_list.mjs": "c6a7b29204fae025ff5e9383332acaea5d44bc7c522a407a79b8f7a6bc6c312d",
+    "https://deno.land/[email protected]/node/internal/streams/compose.mjs": "b522daab35a80ae62296012a4254fd7edfc0366080ffe63ddda4e38fe6b6803e",
+    "https://deno.land/[email protected]/node/internal/streams/destroy.mjs": "9c9bbeb172a437041d529829f433df72cf0b63ae49f3ee6080a55ffbef7572ad",
+    "https://deno.land/[email protected]/node/internal/streams/duplex.mjs": "b014087cd04f79b8a4028d8b9423b987e07bbfacf3b5df518cb752ac3657580f",
+    "https://deno.land/[email protected]/node/internal/streams/end-of-stream.mjs": "38be76eaceac231dfde643e72bc0940625446bf6d1dbd995c91c5ba9fd59b338",
+    "https://deno.land/[email protected]/node/internal/streams/from.mjs": "134255c698ed63b33199911eb8e042f8f67e9682409bb11552e6120041ed1872",
+    "https://deno.land/[email protected]/node/internal/streams/legacy.mjs": "6ea28db95d4503447473e62f0b23ff473bfe1751223c33a3c5816652e93b257a",
+    "https://deno.land/[email protected]/node/internal/streams/passthrough.mjs": "a51074193b959f3103d94de41e23a78dfcff532bdba53af9146b86340d85eded",
+    "https://deno.land/[email protected]/node/internal/streams/pipeline.mjs": "9890b121759ede869174ef70c011fde964ca94d81f2ed97b8622d7cb17b49285",
+    "https://deno.land/[email protected]/node/internal/streams/readable.mjs": "a70c41171ae25c556b52785b0c178328014bd33d8c0e4d229d4adaac7414b6ca",
+    "https://deno.land/[email protected]/node/internal/streams/state.mjs": "9ef917392a9d8005a6e038260c5fd31518d2753aea0bc9e39824c199310434cb",
+    "https://deno.land/[email protected]/node/internal/streams/transform.mjs": "3b361abad2ac78f7ccb6f305012bafdc0e983dfa4bb6ecddb4626e34a781a5f5",
+    "https://deno.land/[email protected]/node/internal/streams/utils.mjs": "06c21d0db0d51f1bf1e3225a661c3c29909be80355d268e64ee5922fc5eb6c5e",
+    "https://deno.land/[email protected]/node/internal/streams/writable.mjs": "ad4e2b176ffdf752c8e678ead3a514679a5a8d652f4acf797115dceb798744d5",
+    "https://deno.land/[email protected]/node/internal/timers.mjs": "b43e24580cec2dd50f795e4342251a79515c0db21630c25b40fdc380a78b74e7",
+    "https://deno.land/[email protected]/node/internal/url.ts": "eacef0ace4f4c5394e9818a81499f4871b2a993d1bd3b902047e44a381ef0e22",
+    "https://deno.land/[email protected]/node/internal/util.mjs": "2f0c8ff553c175ea6e4ed13d7cd7cd6b86dc093dc2f783c6c3dfc63f60a0943e",
+    "https://deno.land/[email protected]/node/internal/util/comparisons.ts": "680b55fe8bdf1613633bc469fa0440f43162c76dbe36af9aa2966310e1bb9f6e",
+    "https://deno.land/[email protected]/node/internal/util/debuglog.ts": "99e91bdf26f6c67861031f684817e1705a5bc300e81346585b396f413387edfb",
+    "https://deno.land/[email protected]/node/internal/util/inspect.mjs": "d1c2569c66a3dab45eec03208f22ad4351482527859c0011a28a6c797288a0aa",
+    "https://deno.land/[email protected]/node/internal/util/types.ts": "b2dacb8f1f5d28a51c4da5c5b75172b7fcf694073ce95ca141323657e18b0c60",
+    "https://deno.land/[email protected]/node/internal/validators.mjs": "a7e82eafb7deb85c332d5f8d9ffef052f46a42d4a121eada4a54232451acc49a",
+    "https://deno.land/[email protected]/node/internal_binding/_libuv_winerror.ts": "801e05c2742ae6cd42a5f0fd555a255a7308a65732551e962e5345f55eedc519",
+    "https://deno.land/[email protected]/node/internal_binding/_node.ts": "e4075ba8a37aef4eb5b592c8e3807c39cb49ca8653faf8e01a43421938076c1b",
+    "https://deno.land/[email protected]/node/internal_binding/_utils.ts": "1c50883b5751a9ea1b38951e62ed63bacfdc9d69ea665292edfa28e1b1c5bd94",
+    "https://deno.land/[email protected]/node/internal_binding/_winerror.ts": "8811d4be66f918c165370b619259c1f35e8c3e458b8539db64c704fbde0a7cd2",
+    "https://deno.land/[email protected]/node/internal_binding/async_wrap.ts": "f06b8a403ad871248eb064190d27bf6fefdbe948991e71a18d7077390d5773f9",
+    "https://deno.land/[email protected]/node/internal_binding/buffer.ts": "722c62b85f966e0777b2d98c021b60e75d7f2c2dabc43413ef37d60dbd13a5d9",
+    "https://deno.land/[email protected]/node/internal_binding/cares_wrap.ts": "25b7b5d56612b2985260b673021828d6511a1c83b4c1927f5732cad2f2a718af",
+    "https://deno.land/[email protected]/node/internal_binding/config.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/connection_wrap.ts": "0380444ee94d5bd7b0b09921223d16729c9762a94e80b7f51eda49c7f42e6d0a",
+    "https://deno.land/[email protected]/node/internal_binding/constants.ts": "aff06aac49eda4234bd3a2b0b8e1fbfc67824e281c532ff9960831ab503014cc",
+    "https://deno.land/[email protected]/node/internal_binding/contextify.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/credentials.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/crypto.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/errors.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/fs.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/fs_dir.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/fs_event_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/handle_wrap.ts": "e59df84b1fb1b9823b09774b3e512d9c0029b4557400d09dd02cd7661c2c4830",
+    "https://deno.land/[email protected]/node/internal_binding/heap_utils.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/http_parser.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/icu.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/inspector.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/js_stream.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/messaging.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/mod.ts": "f68e74e8eed84eaa6b0de24f0f4c47735ed46866d7ee1c5a5e7c0667b4f0540f",
+    "https://deno.land/[email protected]/node/internal_binding/module_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/native_module.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/natives.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/node_file.ts": "c96ee0b2af319a3916de950a6c4b0d5fb00d09395c51cd239c54d95d62567aaf",
+    "https://deno.land/[email protected]/node/internal_binding/node_options.ts": "3cd5706153d28a4f5944b8b162c1c61b7b8e368a448fb1a2cff9f7957d3db360",
+    "https://deno.land/[email protected]/node/internal_binding/options.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/os.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/performance.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/pipe_wrap.ts": "00e942327f8e1c4b74a5888a82f0e16ba775cd09af804f96b6f6849b7eab1719",
+    "https://deno.land/[email protected]/node/internal_binding/process_methods.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/report.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/serdes.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/signal_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/spawn_sync.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/stream_wrap.ts": "d6e96f4b89d82ad5cc9b243c3d3880c9d85086165da54a7d85821a63491e5abf",
+    "https://deno.land/[email protected]/node/internal_binding/string_decoder.ts": "5cb1863763d1e9b458bc21d6f976f16d9c18b3b3f57eaf0ade120aee38fba227",
+    "https://deno.land/[email protected]/node/internal_binding/symbols.ts": "51cfca9bb6132d42071d4e9e6b68a340a7f274041cfcba3ad02900886e972a6c",
+    "https://deno.land/[email protected]/node/internal_binding/task_queue.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/tcp_wrap.ts": "10c64d5e092a8bff99cfe05adea716e4e52f4158662a5821790953e47e2cc21c",
+    "https://deno.land/[email protected]/node/internal_binding/timers.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/tls_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/trace_events.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/tty_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/types.ts": "4c26fb74ba2e45de553c15014c916df6789529a93171e450d5afb016b4c765e7",
+    "https://deno.land/[email protected]/node/internal_binding/udp_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/url.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/util.ts": "90364292e2bd598ab5d105b48ca49817b6708f2d1d9cbaf08b2b3ab5ca4c90a7",
+    "https://deno.land/[email protected]/node/internal_binding/uv.ts": "3821bc5e676d6955d68f581988c961d77dd28190aba5a9c59f16001a4deb34ba",
+    "https://deno.land/[email protected]/node/internal_binding/v8.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/worker.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/internal_binding/zlib.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4",
+    "https://deno.land/[email protected]/node/net.ts": "dfcb7e412abb3d5c55edde7d823b0ccb9601f7d40555ae3c862810c78b176185",
+    "https://deno.land/[email protected]/node/os.ts": "943d3294a7a00f39491148cd2097cdbf101233a421262223bb20ae702c059df5",
+    "https://deno.land/[email protected]/node/path.ts": "c65858e9cbb52dbc0dd348eefcdc41e82906c39cfa7982f2d4d805e828414b8c",
+    "https://deno.land/[email protected]/node/path/_constants.ts": "bd26f24a052b7d6b746151f4a236d29ab3c2096883bb6449c2fa499494406672",
+    "https://deno.land/[email protected]/node/path/_interface.ts": "6034ee29f6f295460ec82db1a94df9269aecbb0eceb81be72e9d843f8e8a97e6",
+    "https://deno.land/[email protected]/node/path/_util.ts": "9d4735fc05f8f1fb94406450e84e23fd201dc3fef5298b009e44cfa4e797b8f0",
+    "https://deno.land/[email protected]/node/path/common.ts": "f41a38a0719a1e85aa11c6ba3bea5e37c15dd009d705bd8873f94c833568cbc4",
+    "https://deno.land/[email protected]/node/path/glob.ts": "d6b64a24f148855a6e8057a171a2f9910c39e492e4ccec482005205b28eb4533",
+    "https://deno.land/[email protected]/node/path/mod.ts": "62e21dc6e1fe2e9742fce85de631a7b067d968544fe66954578e6d73c97369a2",
+    "https://deno.land/[email protected]/node/path/posix.ts": "9dd5fc83c4ae0e0b700bef43c88c67e276840c187a66d4d6a661440cf1fecc52",
+    "https://deno.land/[email protected]/node/path/separator.ts": "c908c9c28ebe7f1fea67daaccf84b63af90d882fe986f9fa03af9563a852723a",
+    "https://deno.land/[email protected]/node/path/win32.ts": "f869ee449b6dee69b13e2d1f8f7f1d01c7ae1e67fa573eab789429929f7a3864",
+    "https://deno.land/[email protected]/node/process.ts": "699f47f2f177556e17e2f7d0dcd3705ff5065cbdf72029e534c1540404d6f501",
+    "https://deno.land/[email protected]/node/querystring.ts": "967b8a7b00a73ebe373666deb3a7e501f164bac27bb342fde7221ecbb3522689",
+    "https://deno.land/[email protected]/node/stream.ts": "d127faa074a9e3886e4a01dcfe9f9a6a4b5641f76f6acc356e8ded7da5dc2c81",
+    "https://deno.land/[email protected]/node/stream/promises.mjs": "b263c09f2d6bd715dc514fab3f99cca84f442e2d23e87adbe76e32ea46fc87e6",
+    "https://deno.land/[email protected]/node/string_decoder.ts": "51ce85a173d2e36ac580d418bb48b804adb41732fc8bd85f7d5d27b7accbc61f",
+    "https://deno.land/[email protected]/node/timers.ts": "2d66fcd21e37acf76c3a699a97230da57cc21382c8e885b3c5377b37efd0f06c",
+    "https://deno.land/[email protected]/node/url.ts": "bc0bde2774854b6a377c4c61fa73e5a28283cbeb7f8703479f44e471219c33a8",
+    "https://deno.land/[email protected]/node/util.ts": "7fd6933b37af89a8e64d73dc6ee1732455a59e7e6d0965311fbd73cd634ea630",
+    "https://deno.land/[email protected]/node/util/types.mjs": "f9288198cacd374b41bae7e92a23179d3160f4c0eaf14e19be3a4e7057219a60",
+    "https://deno.land/[email protected]/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
+    "https://deno.land/[email protected]/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
+    "https://deno.land/[email protected]/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b",
+    "https://deno.land/[email protected]/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
+    "https://deno.land/[email protected]/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
+    "https://deno.land/[email protected]/path/mod.ts": "4275129bb766f0e475ecc5246aa35689eeade419d72a48355203f31802640be7",
+    "https://deno.land/[email protected]/path/posix.ts": "663e4a6fe30a145f56aa41a22d95114c4c5582d8b57d2d7c9ed27ad2c47636bb",
+    "https://deno.land/[email protected]/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
+    "https://deno.land/[email protected]/path/win32.ts": "e7bdf63e8d9982b4d8a01ef5689425c93310ece950e517476e22af10f41a136e",
+    "https://deno.land/[email protected]/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21",
+    "https://deno.land/[email protected]/testing/_diff.ts": "9d849cd6877694152e01775b2d93f9d6b7aef7e24bfe3bfafc4d7a1ac8e9f392",
+    "https://deno.land/[email protected]/testing/asserts.ts": "b0ef969032882b1f7eb1c7571e313214baa1485f7b61cf35807b2434e254365c",
+    "https://deno.land/x/[email protected]/mod.ts": "52b0de822cc5529d6051584fe98c5b8d75f2bfb063f1df86df7b07513cc353a2",
+    "https://deno.land/x/[email protected]/application.ts": "69fb6462eed013562ee61239e60ea77e5df3abb2b0df34568593b9774d72e98f",
+    "https://deno.land/x/[email protected]/body.ts": "f91d8e0298abbabe6acb543d1090e2a41aa665375918a575d72bd6b98b538e40",
+    "https://deno.land/x/[email protected]/context.ts": "e04c3d67d68ee01a279aeded457b0d66255450593dacab22251e7eb0cf6a92e5",
+    "https://deno.land/x/[email protected]/deps.ts": "c71a9421d2ead7803468cd40559cf122ee91d4e81e8a3a98706956f6654e2550",
+    "https://deno.land/x/[email protected]/http_server_bun.ts": "c7f3eb6464d4f047fcc9335e632ffb6bfc24e5ef7dc9a53017a6e453d4197e4b",
+    "https://deno.land/x/[email protected]/http_server_native.ts": "34bab402cc9b6fdf53706699ac2c2ab88faf5c14be2ae18aa105bdc4fd6a8471",
+    "https://deno.land/x/[email protected]/http_server_native_request.ts": "aa98a2f4bbf6f7651c62eb0332a95a1b0faff1d76f7a07fa8bd600766eb24488",
+    "https://deno.land/x/[email protected]/http_server_node.ts": "bfbf7585fcda5a1464cd0f904ec97cbb4d67367757f3ed8cdc99a590a94b34e1",
+    "https://deno.land/x/[email protected]/middleware.ts": "a701caf9d872b93d26759f77c7ad545cb29bc3d197c8375b79b2fbe7e9e60958",
+    "https://deno.land/x/[email protected]/middleware/etag.ts": "f5cf8eb2a7c99ae7e11a4e31dc60beda398aec7a08be343e0de6b632f8064e4d",
+    "https://deno.land/x/[email protected]/middleware/proxy.ts": "e611b7d45f58a1b2caa1cb6c435774822d7b56aa136b8dbb8691fb52d07c5182",
+    "https://deno.land/x/[email protected]/middleware/serve.ts": "66f1e405ac006bfa863e8852092e03951b93dd4ba8381996a719d93d00aa62fe",
+    "https://deno.land/x/[email protected]/mod.ts": "1f42341a6138310eceaf7b8e9b72be4d2a913817d1e823090dee4e7d27c68e98",
+    "https://deno.land/x/[email protected]/node_shims.ts": "e411aef698dca26dfc577d8581ddab678f528bd52bf681337f3c3bcc73845a0a",
+    "https://deno.land/x/[email protected]/request.ts": "5123fd70841a540809702059527a192d22f78042db1bfc4a01eebd77ec25b0fb",
+    "https://deno.land/x/[email protected]/response.ts": "483f8ddd7618325e6ac28f88a3ea9926a09b3c90fa53b481a7a5202d23a0755f",
+    "https://deno.land/x/[email protected]/router.ts": "e8eb2f88806dfdd303f3a663fefb7d9e614342bf40738692e9ef4b2243e1bccd",
+    "https://deno.land/x/[email protected]/send.ts": "42faed583f218ed85d5da7704f36b385537947ec4de6125e20ad8acbfe8d8f68",
+    "https://deno.land/x/[email protected]/testing.ts": "d6489e78d689da08b9896cd0b9b9add243466b407ce6fd63d38e29f8c0a19f5c",
+    "https://deno.land/x/[email protected]/types.ts": "0e74c6c46e0fcfddd87e90fe0216c4ae50c73b113e06d3bdc4283afc7b2570d6",
+    "https://deno.land/x/[email protected]/utils/clone_state.ts": "5a0784d802b86cc3dbf415dfd286025f03a261b3a8f9b3b6fd671be8e51ff027",
+    "https://deno.land/x/[email protected]/utils/consts.ts": "9e14324837558d7af3d4bfc8ba5f13216a0b5d2f8dac14a3a782bc1bbfb756ef",
+    "https://deno.land/x/[email protected]/utils/create_promise_with_resolvers.ts": "f7eeaf65ffa7b6cef03b8dc3fa3a3e35ae5553c6abf1a2260d7797e076acd63a",
+    "https://deno.land/x/[email protected]/utils/decode.ts": "434802a09534a26cc8b8cd009ecc422b4695d22859021fe34f8093784b2483b7",
+    "https://deno.land/x/[email protected]/utils/decode_component.ts": "d68e6da33bf6e733d218c0b7ce7112520640e836f4cfa2760c4aee8facf1c581",
+    "https://deno.land/x/[email protected]/utils/encode_url.ts": "16b213d70f5e211fb3633f97c704f9613d2f8033669d59e0c9ca4fc26551fad6",
+    "https://deno.land/x/[email protected]/utils/resolve_path.ts": "aa39d54a003b38fee55f340a0cba3f93a7af85b8ddd5fbfb049a98fc0109b36d",
+    "https://deno.land/x/[email protected]/utils/streams.ts": "c85ae197f5046d58d5a3e42221254a6c8e63172f9f01b77631e480e1dcc90e05",
+    "https://deno.land/x/[email protected]/utils/type_guards.ts": "92ab7dae4bc5ce10206fb21ca13bedd13a4638848be15f9752146aedeab1fea4",
+    "https://deno.land/x/[email protected]/mod.js": "cb68f17d6d90df318934deccdb469d740be0888e7a597a9e7eea7100ce36a252",
+    "https://deno.land/x/[email protected]/polyfills.js": "318eb01f2b4cc33a46c59f3ddc11f22a56d6b1db8b7719b2ad7decee63a5bd47",
+    "https://deno.land/x/[email protected]/src/bytes.js": "f2de43bdc8fa5dc4b169f2c70d5d8b053a3dea8f85ef011d7b27dec69e14ebb7",
+    "https://deno.land/x/[email protected]/src/connection.js": "e63062451fb6a7284c14540b3f268d1373c3028fb0f3b234056ad56569190e8f",
+    "https://deno.land/x/[email protected]/src/errors.js": "85cfbed9a5ab0db41ab8e97b806c881af29807dfe99bc656fdf1a18c1c13b6c6",
+    "https://deno.land/x/[email protected]/src/index.js": "9dca008e765675f8218d4e2e3ccc75359cc2240f7be4e80bf6735e92b5562e3a",
+    "https://deno.land/x/[email protected]/src/large.js": "f3e770cdb7cc695f7b50687b4c6c4b7252129515486ec8def98b7582ee7c54ef",
+    "https://deno.land/x/[email protected]/src/query.js": "67c45a5151032aa46b587abc15381fe4efd97c696e5c1b53082b8161309c4ee2",
+    "https://deno.land/x/[email protected]/src/queue.js": "15e6345adb6708bf3b99ad39fc2231c2fb61de5f6cba4b7a7a6be881482a4ec3",
+    "https://deno.land/x/[email protected]/src/result.js": "001ff5e0c8d634674f483d07fbcd620a797e3101f842d6c20ca3ace936260465",
+    "https://deno.land/x/[email protected]/src/subscribe.js": "9e4d0c3e573a6048e77ee2f15abbd5bcd17da9ca85a78c914553472c6d6c169b",
+    "https://deno.land/x/[email protected]/src/types.js": "471f4a6c35412aa202a7c177c0a7e5a7c3bd225f01bbde67c947894c1b8bf6ed"
+  },
+  "workspace": {
+    "dependencies": [
+      "jsr:@oak/[email protected]",
+      "jsr:@std/[email protected]"
+    ]
+  }
+}

+ 19 - 0
frameworks/TypeScript/oak/oak-postgresjs.dockerfile

@@ -0,0 +1,19 @@
+FROM denoland/deno:2.3.1
+
+EXPOSE 8080
+
+WORKDIR /app
+
+USER deno
+
+ENV PG_NAME hello_world
+ENV PG_HOST tfb-database
+ENV PG_USER benchmarkdbuser
+ENV PG_PSWD benchmarkdbpass
+ENV DATABASE postgres
+
+COPY . .
+
+RUN deno install --entrypoint ./src/main.ts
+
+CMD ["deno", "serve", "--parallel", "--port", "8080", "--host", "0.0.0.0", "-A", "./src/main.ts"]

+ 6 - 5
frameworks/TypeScript/oak/oak.dockerfile

@@ -1,4 +1,4 @@
-FROM denoland/deno
+FROM denoland/deno:2.3.1
 
 EXPOSE 8080
 
@@ -6,7 +6,8 @@ WORKDIR /app
 
 USER deno
 
-COPY ./src/deps.ts .
-RUN deno cache deps.ts
-ADD ./src .
-CMD [ "run", "--allow-all", "main.ts" ]
+COPY . .
+
+RUN deno install --entrypoint ./src/main.ts
+
+CMD ["deno", "serve", "--parallel", "--port", "8080", "--host", "0.0.0.0", "-A", "./src/main.ts"]

+ 0 - 20
frameworks/TypeScript/oak/src/deps.ts

@@ -1,20 +0,0 @@
-export {
-  Application,
-  Context,
-  Router,
-  Status,
-} from "https://deno.land/x/[email protected]/mod.ts";
-export { getQuery } from "https://deno.land/x/[email protected]/helpers.ts";
-export type { ResponseBody } from "https://deno.land/x/[email protected]/response.ts";
-
-export {
-  Column,
-  connect,
-  DataType,
-  Manager,
-  Model,
-  Primary,
-} from "https://deno.land/x/[email protected]/mod.ts";
-export type { DatabaseResult } from "https://deno.land/x/[email protected]/src/adapters/adapter.ts";
-
-export { html } from "https://deno.land/x/[email protected]/mod.ts";

+ 2 - 1
frameworks/TypeScript/oak/src/helpers.ts

@@ -1,4 +1,5 @@
-import { Context, ResponseBody, Status } from "./deps.ts";
+import { Context, Status } from "oak";
+import { ResponseBody } from "oak/response";
 
 export function Ok(ctx: Context, body: ResponseBody) {
   ctx.response.status = Status.OK;

+ 3 - 14
frameworks/TypeScript/oak/src/main.ts

@@ -1,10 +1,7 @@
-import { Application, DatabaseResult, Manager } from "./deps.ts";
+import { Application } from "oak";
 import { router } from "./routes.ts";
-import { getDbClient } from "./utils.ts";
 
-const app = new Application<
-  { manager: Manager; cached_worlds: DatabaseResult[] }
->();
+const app = new Application();
 
 // headers
 app.use(async (ctx, next) => {
@@ -13,15 +10,7 @@ app.use(async (ctx, next) => {
   await next();
 });
 
-// database handling
-app.use(async (ctx, next) => {
-  const db = await getDbClient();
-  ctx.state.manager = db.getManager();
-  await next();
-  await db.disconnect();
-});
-
 app.use(router.routes());
 app.use(router.allowedMethods());
 
-await app.listen({ port: 8080 });
+export default { fetch: app.fetch };

+ 0 - 19
frameworks/TypeScript/oak/src/models.ts

@@ -1,19 +0,0 @@
-import { Column, DataType, Model, Primary } from "./deps.ts";
-
-@Model()
-export class World {
-  @Primary()
-  id!: number;
-
-  @Column({ type: DataType.Number })
-  randomnumber!: number;
-}
-
-@Model()
-export class Fortune {
-  @Primary()
-  id!: number;
-
-  @Column({ type: DataType.String })
-  message!: string;
-}

+ 35 - 0
frameworks/TypeScript/oak/src/postgres.ts

@@ -0,0 +1,35 @@
+import postgres from 'postgres';
+import type { World, Fortune } from './types.ts';
+
+const sql = postgres({ 
+  host: Deno.env.get("PG_HOST"),
+  user: Deno.env.get("PG_USER"),
+  database: Deno.env.get("PG_NAME"),
+  password: Deno.env.get("PG_PSWD"),
+  max: 1
+});
+
+export function allFortunes() {
+  return sql<Fortune[]>`select id, message from fortune`;
+}
+
+export function getAllWorlds() {
+  return sql<World[]>`SELECT id, randomNumber FROM world`;
+}
+
+export async function getWorld(id: number) {
+  const result = await sql<World[]>`select id, randomNumber from world where id = ${id}`;
+  return result[0];
+}
+
+export async function bulkUpdate(worlds: World[]) {
+  const values = sql(
+    worlds
+      .map((world) => [world.id, world.randomnumber])
+      .sort((a, b) => (a[0] < b[0] ? -1 : 1))
+  );
+
+  await sql`update world set randomNumber = (update_data.randomNumber)::int
+    from (values ${values}) as update_data (id, randomNumber)
+    where world.id = (update_data.id)::int`;
+}

+ 38 - 30
frameworks/TypeScript/oak/src/routes.ts

@@ -1,57 +1,63 @@
-import { Fortune, World } from "./models.ts";
+import { Router } from "oak";
+import { LruCache } from "lru-cache";
 import { NotFound, Ok } from "./helpers.ts";
+import type { Fortune, World } from "./types.ts";
 import {
-  getDbClient,
   parseQuery,
   randomNumber,
   renderTemplate,
 } from "./utils.ts";
-import { Router } from "./deps.ts";
-
-const cached_worlds = await (await getDbClient()).getManager().query(World)
-  .limit(10000).all();
+import { 
+  getWorld, 
+  bulkUpdate, 
+  allFortunes, 
+  getAllWorlds 
+} from "./postgres.ts";
 
 export const router = new Router()
   .get("/plaintext", (ctx) => Ok(ctx, "Hello, World!"))
-  .get("/json", (ctx) => Ok(ctx, { message: "Hello, World!" }))
-  .get("/db", async (ctx) => {
-    const world = await ctx.state.manager.query(World).where(
-      "id",
-      randomNumber(),
-    ).first();
+  .get("/json", (ctx) => Ok(ctx, { message: "Hello, World!" }));
+
+if (Deno.env.has("DATABASE")) {
+  const cache = new LruCache<number, World>(10_000);
+  (await getAllWorlds()).forEach(world => cache.set(world.id, world));
+  
+  router.get("/db", async (ctx) => {
+    const world = await getWorld(randomNumber());
     Ok(ctx, world);
   })
   .get("/queries", async (ctx) => {
-    const worlds = [];
+    const worldsPromises = [];
     const queries = parseQuery(ctx);
     for (let i = 0; i < queries; i++) {
-      const world = await ctx.state.manager.query(World).where(
-        "id",
-        randomNumber(),
-      ).first();
-      worlds.push(world);
+      worldsPromises.push(getWorld(randomNumber()));
     }
 
+    const worlds = await Promise.all(worldsPromises);
     Ok(ctx, worlds);
   })
   .get("/updates", async (ctx) => {
-    const worlds = [];
+    const worldsPromises: Promise<World>[] = [];
     const queries = parseQuery(ctx);
 
     for (let i = 0; i < queries; i++) {
-      const world = await ctx.state.manager.query(World).where(
-        "id",
-        randomNumber(),
-      ).first();
+      const world = getWorld(randomNumber());
+      worldsPromises.push(world);
+    }
+
+    const worlds = await Promise.all(worldsPromises);
+
+    const newWorlds = worlds.map((world) => {
       world.randomnumber = randomNumber();
-      worlds.push(world);
+      return world;
+    });
 
-      await ctx.state.manager.save(world);
-    }
-    Ok(ctx, worlds);
+    await bulkUpdate(newWorlds);
+
+    Ok(ctx, newWorlds);
   })
   .get("/fortunes", async (ctx) => {
-    const fortunes: Fortune[] = await ctx.state.manager.query(Fortune).all();
+    const fortunes = await allFortunes();
     fortunes.push({
       id: 0,
       message: "Additional fortune added at request time.",
@@ -69,8 +75,10 @@ export const router = new Router()
     const worlds = [];
 
     for (let i = 0; i < queries; i++) {
-      worlds.push(cached_worlds[randomNumber()]);
+      worlds.push(cache.get(randomNumber()));
     }
     Ok(ctx, worlds);
   })
-  .get("/(.*)", (ctx) => NotFound(ctx));
+}
+
+router.get("/(.*)", (ctx) => NotFound(ctx));

+ 9 - 0
frameworks/TypeScript/oak/src/types.ts

@@ -0,0 +1,9 @@
+export interface World {
+  id: number;
+  randomnumber: number;
+}
+
+export interface Fortune {
+  id: number;
+  message: string;
+}

+ 9 - 14
frameworks/TypeScript/oak/src/utils.ts

@@ -1,12 +1,18 @@
-import { connect, Context, getQuery, html } from "./deps.ts";
-import { Fortune } from "./models.ts";
+import { html } from "html";
+import { Context } from "oak";
+import type { Fortune } from "./types.ts";
 
 export const randomNumber = () => {
   return Math.floor(Math.random() * 10000 + 1);
 };
 
 export const parseQuery = (ctx: Context) => {
-  return Math.min(parseInt(getQuery(ctx).q) || 1, 500);
+  const queryParam = ctx.request.url.searchParams.get('q') ?? '1';
+  const parseValue = parseInt(queryParam, 10);
+  if (isNaN(parseValue) || parseValue < 1) {
+    return 1;
+  }
+  return Math.min(parseValue, 500);
 };
 
 export const renderTemplate = (fortunes: Fortune[]) => {
@@ -28,14 +34,3 @@ export const renderTemplate = (fortunes: Fortune[]) => {
     </body>
   </html>`;
 };
-
-export async function getDbClient() {
-  return await connect({
-    type: "postgres",
-    port: 5432,
-    database: "hello_world",
-    hostname: "tfb-database",
-    username: "benchmarkdbuser",
-    password: "benchmarkdbpass",
-  });
-}

+ 0 - 6
frameworks/TypeScript/oak/tsconfig.json

@@ -1,6 +0,0 @@
-{
-  "compilerOptions": {
-    "experimentalDecorators": true,
-    "emitDecoratorMetadata": true
-  }
-}