├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── config.capnp ├── package-lock.json ├── package.json ├── src ├── create.ts ├── index.ts └── redirect.ts └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | indent_size = 2 6 | tab_width = 2 7 | end_of_line = lf 8 | insert_final_newline = true -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | kv/ 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Daniel Walsh 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Workerd Example 2 | 3 | This is an example Worker which can be ran with workerd 4 | 5 | This example includes bundling a Worker up and using KV (persisting to a `kv` directory) 6 | 7 | ## Running 8 | 9 | To run simply install the dependencies and run workerd :) 10 | 11 | Requests are served at http://localhost:8080 (can be changed in `config.capnp`) 12 | 13 | ``` 14 | # Install the dependencies (including workerd) 15 | $ npm i 16 | 17 | # Bundle your Worker and start Workerd serving the Worker 18 | $ npm run dev 19 | ``` 20 | 21 | ## Testing 22 | 23 | Once the Worker is running we can test it! 24 | 25 | To create a redirect do a `POST` to `/create` like so: 26 | ``` 27 | $ curl -X POST -d '{"slug": "test", "destination": "https://walshy.dev"}' http://localhost:8080/create 28 | ``` 29 | 30 | Then to test the redirect simply send a `GET` request to the slug like so: 31 | ``` 32 | $ curl -i http://localhost:8080/test 33 | HTTP/1.1 302 Found 34 | Content-Length: 0 35 | Location: https://walshy.dev 36 | ``` 37 | -------------------------------------------------------------------------------- /config.capnp: -------------------------------------------------------------------------------- 1 | using Workerd = import "/workerd/workerd.capnp"; 2 | 3 | const config :Workerd.Config = ( 4 | services = [ 5 | (name = "main", worker = .mainWorker), 6 | (name = "kv", disk = ( path = "kv", writable = true, allowDotfiles = false ) ) 7 | ], 8 | 9 | sockets = [ 10 | # Serve HTTP on port 8080. 11 | ( name = "http", 12 | address = "*:8080", 13 | http = (), 14 | service = "main" 15 | ), 16 | ] 17 | ); 18 | 19 | const mainWorker :Workerd.Worker = ( 20 | compatibilityDate = "2022-09-17", 21 | 22 | modules = [ 23 | ( name = "dist/worker.mjs", esModule = embed "dist/worker.mjs" ), 24 | ], 25 | bindings = [ 26 | ( name = "KV", kvNamespace = ( name = "kv" ) ), 27 | ], 28 | ); 29 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "workerd-example", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "workerd-example", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "hono": "^2.2.1" 13 | }, 14 | "devDependencies": { 15 | "@cloudflare/workers-types": "^3.16.0", 16 | "esbuild": "^0.15.9", 17 | "typescript": "^4.8.3", 18 | "workerd": "^1.20220926.1" 19 | } 20 | }, 21 | "node_modules/@cloudflare/workerd-darwin-64": { 22 | "version": "1.20220926.0", 23 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20220926.0.tgz", 24 | "integrity": "sha512-NbZ+NOviUvMHv4FLB2dlTIOp8Vh86qVCZEeQjaZ9NHjqKh9uyUEsKDuLIjea5XW+i9jHhyTlh3UQ4r2zcVhB3Q==", 25 | "cpu": [ 26 | "x64" 27 | ], 28 | "dev": true, 29 | "optional": true, 30 | "os": [ 31 | "darwin" 32 | ], 33 | "engines": { 34 | "node": ">=16" 35 | } 36 | }, 37 | "node_modules/@cloudflare/workerd-darwin-arm64": { 38 | "version": "1.20220926.1", 39 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20220926.1.tgz", 40 | "integrity": "sha512-jWVxVsUDggsZPBusmzcj5ZxYjMPWJDfcYvwp2O9IIZaKaYLrr+SIablGxLwSevGxOaFtyTvl+auLBCr+FMLwXw==", 41 | "cpu": [ 42 | "arm64" 43 | ], 44 | "dev": true, 45 | "optional": true, 46 | "os": [ 47 | "darwin" 48 | ], 49 | "engines": { 50 | "node": ">=16" 51 | } 52 | }, 53 | "node_modules/@cloudflare/workerd-linux-64": { 54 | "version": "1.20220926.1", 55 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20220926.1.tgz", 56 | "integrity": "sha512-OozSpaj4NrPutxMovKvUojgVtJcHEC1kKgEnmDQgQ0AxdoFKbFxkkHAC1S55rWn969wvf2sKztPSSZ7wZ6Mraw==", 57 | "cpu": [ 58 | "x64" 59 | ], 60 | "dev": true, 61 | "optional": true, 62 | "os": [ 63 | "linux" 64 | ], 65 | "engines": { 66 | "node": ">=16" 67 | } 68 | }, 69 | "node_modules/@cloudflare/workerd-linux-arm64": { 70 | "version": "1.20220926.1", 71 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20220926.1.tgz", 72 | "integrity": "sha512-PY4mYaKybLlhvkaXEs/wG4mFqmc2FQ71mBWWjUPjpcUe+Zhyhy/viDbq2MhjcryV5o69GPe4jHTVAe/PyKC6BA==", 73 | "cpu": [ 74 | "arm64" 75 | ], 76 | "dev": true, 77 | "optional": true, 78 | "os": [ 79 | "linux" 80 | ], 81 | "engines": { 82 | "node": ">=16" 83 | } 84 | }, 85 | "node_modules/@cloudflare/workers-types": { 86 | "version": "3.16.0", 87 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-3.16.0.tgz", 88 | "integrity": "sha512-gaBUSaKS65mN3iKZEgichbXYEmAa/pXkc5Gbt+1BptYphdGkj09ggdsiE4w8g0F/uI1g36QaTKrzVnBAWMipvQ==", 89 | "dev": true 90 | }, 91 | "node_modules/@esbuild/android-arm": { 92 | "version": "0.15.9", 93 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.9.tgz", 94 | "integrity": "sha512-VZPy/ETF3fBG5PiinIkA0W/tlsvlEgJccyN2DzWZEl0DlVKRbu91PvY2D6Lxgluj4w9QtYHjOWjAT44C+oQ+EQ==", 95 | "cpu": [ 96 | "arm" 97 | ], 98 | "dev": true, 99 | "optional": true, 100 | "os": [ 101 | "android" 102 | ], 103 | "engines": { 104 | "node": ">=12" 105 | } 106 | }, 107 | "node_modules/@esbuild/linux-loong64": { 108 | "version": "0.15.9", 109 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.9.tgz", 110 | "integrity": "sha512-O+NfmkfRrb3uSsTa4jE3WApidSe3N5++fyOVGP1SmMZi4A3BZELkhUUvj5hwmMuNdlpzAZ8iAPz2vmcR7DCFQA==", 111 | "cpu": [ 112 | "loong64" 113 | ], 114 | "dev": true, 115 | "optional": true, 116 | "os": [ 117 | "linux" 118 | ], 119 | "engines": { 120 | "node": ">=12" 121 | } 122 | }, 123 | "node_modules/esbuild": { 124 | "version": "0.15.9", 125 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.9.tgz", 126 | "integrity": "sha512-OnYr1rkMVxtmMHIAKZLMcEUlJmqcbxBz9QoBU8G9v455na0fuzlT/GLu6l+SRghrk0Mm2fSSciMmzV43Q8e0Gg==", 127 | "dev": true, 128 | "hasInstallScript": true, 129 | "bin": { 130 | "esbuild": "bin/esbuild" 131 | }, 132 | "engines": { 133 | "node": ">=12" 134 | }, 135 | "optionalDependencies": { 136 | "@esbuild/android-arm": "0.15.9", 137 | "@esbuild/linux-loong64": "0.15.9", 138 | "esbuild-android-64": "0.15.9", 139 | "esbuild-android-arm64": "0.15.9", 140 | "esbuild-darwin-64": "0.15.9", 141 | "esbuild-darwin-arm64": "0.15.9", 142 | "esbuild-freebsd-64": "0.15.9", 143 | "esbuild-freebsd-arm64": "0.15.9", 144 | "esbuild-linux-32": "0.15.9", 145 | "esbuild-linux-64": "0.15.9", 146 | "esbuild-linux-arm": "0.15.9", 147 | "esbuild-linux-arm64": "0.15.9", 148 | "esbuild-linux-mips64le": "0.15.9", 149 | "esbuild-linux-ppc64le": "0.15.9", 150 | "esbuild-linux-riscv64": "0.15.9", 151 | "esbuild-linux-s390x": "0.15.9", 152 | "esbuild-netbsd-64": "0.15.9", 153 | "esbuild-openbsd-64": "0.15.9", 154 | "esbuild-sunos-64": "0.15.9", 155 | "esbuild-windows-32": "0.15.9", 156 | "esbuild-windows-64": "0.15.9", 157 | "esbuild-windows-arm64": "0.15.9" 158 | } 159 | }, 160 | "node_modules/esbuild-android-64": { 161 | "version": "0.15.9", 162 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.9.tgz", 163 | "integrity": "sha512-HQCX7FJn9T4kxZQkhPjNZC7tBWZqJvhlLHPU2SFzrQB/7nDXjmTIFpFTjt7Bd1uFpeXmuwf5h5fZm+x/hLnhbw==", 164 | "cpu": [ 165 | "x64" 166 | ], 167 | "dev": true, 168 | "optional": true, 169 | "os": [ 170 | "android" 171 | ], 172 | "engines": { 173 | "node": ">=12" 174 | } 175 | }, 176 | "node_modules/esbuild-android-arm64": { 177 | "version": "0.15.9", 178 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.9.tgz", 179 | "integrity": "sha512-E6zbLfqbFVCNEKircSHnPiSTsm3fCRxeIMPfrkS33tFjIAoXtwegQfVZqMGR0FlsvVxp2NEDOUz+WW48COCjSg==", 180 | "cpu": [ 181 | "arm64" 182 | ], 183 | "dev": true, 184 | "optional": true, 185 | "os": [ 186 | "android" 187 | ], 188 | "engines": { 189 | "node": ">=12" 190 | } 191 | }, 192 | "node_modules/esbuild-darwin-64": { 193 | "version": "0.15.9", 194 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.9.tgz", 195 | "integrity": "sha512-gI7dClcDN/HHVacZhTmGjl0/TWZcGuKJ0I7/xDGJwRQQn7aafZGtvagOFNmuOq+OBFPhlPv1T6JElOXb0unkSQ==", 196 | "cpu": [ 197 | "x64" 198 | ], 199 | "dev": true, 200 | "optional": true, 201 | "os": [ 202 | "darwin" 203 | ], 204 | "engines": { 205 | "node": ">=12" 206 | } 207 | }, 208 | "node_modules/esbuild-darwin-arm64": { 209 | "version": "0.15.9", 210 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.9.tgz", 211 | "integrity": "sha512-VZIMlcRN29yg/sv7DsDwN+OeufCcoTNaTl3Vnav7dL/nvsApD7uvhVRbgyMzv0zU/PP0xRhhIpTyc7lxEzHGSw==", 212 | "cpu": [ 213 | "arm64" 214 | ], 215 | "dev": true, 216 | "optional": true, 217 | "os": [ 218 | "darwin" 219 | ], 220 | "engines": { 221 | "node": ">=12" 222 | } 223 | }, 224 | "node_modules/esbuild-freebsd-64": { 225 | "version": "0.15.9", 226 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.9.tgz", 227 | "integrity": "sha512-uM4z5bTvuAXqPxrI204txhlsPIolQPWRMLenvGuCPZTnnGlCMF2QLs0Plcm26gcskhxewYo9LkkmYSS5Czrb5A==", 228 | "cpu": [ 229 | "x64" 230 | ], 231 | "dev": true, 232 | "optional": true, 233 | "os": [ 234 | "freebsd" 235 | ], 236 | "engines": { 237 | "node": ">=12" 238 | } 239 | }, 240 | "node_modules/esbuild-freebsd-arm64": { 241 | "version": "0.15.9", 242 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.9.tgz", 243 | "integrity": "sha512-HHDjT3O5gWzicGdgJ5yokZVN9K9KG05SnERwl9nBYZaCjcCgj/sX8Ps1jvoFSfNCO04JSsHSOWo4qvxFuj8FoA==", 244 | "cpu": [ 245 | "arm64" 246 | ], 247 | "dev": true, 248 | "optional": true, 249 | "os": [ 250 | "freebsd" 251 | ], 252 | "engines": { 253 | "node": ">=12" 254 | } 255 | }, 256 | "node_modules/esbuild-linux-32": { 257 | "version": "0.15.9", 258 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.9.tgz", 259 | "integrity": "sha512-AQIdE8FugGt1DkcekKi5ycI46QZpGJ/wqcMr7w6YUmOmp2ohQ8eO4sKUsOxNOvYL7hGEVwkndSyszR6HpVHLFg==", 260 | "cpu": [ 261 | "ia32" 262 | ], 263 | "dev": true, 264 | "optional": true, 265 | "os": [ 266 | "linux" 267 | ], 268 | "engines": { 269 | "node": ">=12" 270 | } 271 | }, 272 | "node_modules/esbuild-linux-64": { 273 | "version": "0.15.9", 274 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.9.tgz", 275 | "integrity": "sha512-4RXjae7g6Qs7StZyiYyXTZXBlfODhb1aBVAjd+ANuPmMhWthQilWo7rFHwJwL7DQu1Fjej2sODAVwLbcIVsAYQ==", 276 | "cpu": [ 277 | "x64" 278 | ], 279 | "dev": true, 280 | "optional": true, 281 | "os": [ 282 | "linux" 283 | ], 284 | "engines": { 285 | "node": ">=12" 286 | } 287 | }, 288 | "node_modules/esbuild-linux-arm": { 289 | "version": "0.15.9", 290 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.9.tgz", 291 | "integrity": "sha512-3Zf2GVGUOI7XwChH3qrnTOSqfV1V4CAc/7zLVm4lO6JT6wbJrTgEYCCiNSzziSju+J9Jhf9YGWk/26quWPC6yQ==", 292 | "cpu": [ 293 | "arm" 294 | ], 295 | "dev": true, 296 | "optional": true, 297 | "os": [ 298 | "linux" 299 | ], 300 | "engines": { 301 | "node": ">=12" 302 | } 303 | }, 304 | "node_modules/esbuild-linux-arm64": { 305 | "version": "0.15.9", 306 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.9.tgz", 307 | "integrity": "sha512-a+bTtxJmYmk9d+s2W4/R1SYKDDAldOKmWjWP0BnrWtDbvUBNOm++du0ysPju4mZVoEFgS1yLNW+VXnG/4FNwdQ==", 308 | "cpu": [ 309 | "arm64" 310 | ], 311 | "dev": true, 312 | "optional": true, 313 | "os": [ 314 | "linux" 315 | ], 316 | "engines": { 317 | "node": ">=12" 318 | } 319 | }, 320 | "node_modules/esbuild-linux-mips64le": { 321 | "version": "0.15.9", 322 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.9.tgz", 323 | "integrity": "sha512-Zn9HSylDp89y+TRREMDoGrc3Z4Hs5u56ozZLQCiZAUx2+HdbbXbWdjmw3FdTJ/i7t5Cew6/Q+6kfO3KCcFGlyw==", 324 | "cpu": [ 325 | "mips64el" 326 | ], 327 | "dev": true, 328 | "optional": true, 329 | "os": [ 330 | "linux" 331 | ], 332 | "engines": { 333 | "node": ">=12" 334 | } 335 | }, 336 | "node_modules/esbuild-linux-ppc64le": { 337 | "version": "0.15.9", 338 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.9.tgz", 339 | "integrity": "sha512-OEiOxNAMH9ENFYqRsWUj3CWyN3V8P3ZXyfNAtX5rlCEC/ERXrCEFCJji/1F6POzsXAzxvUJrTSTCy7G6BhA6Fw==", 340 | "cpu": [ 341 | "ppc64" 342 | ], 343 | "dev": true, 344 | "optional": true, 345 | "os": [ 346 | "linux" 347 | ], 348 | "engines": { 349 | "node": ">=12" 350 | } 351 | }, 352 | "node_modules/esbuild-linux-riscv64": { 353 | "version": "0.15.9", 354 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.9.tgz", 355 | "integrity": "sha512-ukm4KsC3QRausEFjzTsOZ/qqazw0YvJsKmfoZZm9QW27OHjk2XKSQGGvx8gIEswft/Sadp03/VZvAaqv5AIwNA==", 356 | "cpu": [ 357 | "riscv64" 358 | ], 359 | "dev": true, 360 | "optional": true, 361 | "os": [ 362 | "linux" 363 | ], 364 | "engines": { 365 | "node": ">=12" 366 | } 367 | }, 368 | "node_modules/esbuild-linux-s390x": { 369 | "version": "0.15.9", 370 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.9.tgz", 371 | "integrity": "sha512-uDOQEH55wQ6ahcIKzQr3VyjGc6Po/xblLGLoUk3fVL1qjlZAibtQr6XRfy5wPJLu/M2o0vQKLq4lyJ2r1tWKcw==", 372 | "cpu": [ 373 | "s390x" 374 | ], 375 | "dev": true, 376 | "optional": true, 377 | "os": [ 378 | "linux" 379 | ], 380 | "engines": { 381 | "node": ">=12" 382 | } 383 | }, 384 | "node_modules/esbuild-netbsd-64": { 385 | "version": "0.15.9", 386 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.9.tgz", 387 | "integrity": "sha512-yWgxaYTQz+TqX80wXRq6xAtb7GSBAp6gqLKfOdANg9qEmAI1Bxn04IrQr0Mzm4AhxvGKoHzjHjMgXbCCSSDxcw==", 388 | "cpu": [ 389 | "x64" 390 | ], 391 | "dev": true, 392 | "optional": true, 393 | "os": [ 394 | "netbsd" 395 | ], 396 | "engines": { 397 | "node": ">=12" 398 | } 399 | }, 400 | "node_modules/esbuild-openbsd-64": { 401 | "version": "0.15.9", 402 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.9.tgz", 403 | "integrity": "sha512-JmS18acQl4iSAjrEha1MfEmUMN4FcnnrtTaJ7Qg0tDCOcgpPPQRLGsZqhes0vmx8VA6IqRyScqXvaL7+Q0Uf3A==", 404 | "cpu": [ 405 | "x64" 406 | ], 407 | "dev": true, 408 | "optional": true, 409 | "os": [ 410 | "openbsd" 411 | ], 412 | "engines": { 413 | "node": ">=12" 414 | } 415 | }, 416 | "node_modules/esbuild-sunos-64": { 417 | "version": "0.15.9", 418 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.9.tgz", 419 | "integrity": "sha512-UKynGSWpzkPmXW3D2UMOD9BZPIuRaSqphxSCwScfEE05Be3KAmvjsBhht1fLzKpiFVJb0BYMd4jEbWMyJ/z1hQ==", 420 | "cpu": [ 421 | "x64" 422 | ], 423 | "dev": true, 424 | "optional": true, 425 | "os": [ 426 | "sunos" 427 | ], 428 | "engines": { 429 | "node": ">=12" 430 | } 431 | }, 432 | "node_modules/esbuild-windows-32": { 433 | "version": "0.15.9", 434 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.9.tgz", 435 | "integrity": "sha512-aqXvu4/W9XyTVqO/hw3rNxKE1TcZiEYHPsXM9LwYmKSX9/hjvfIJzXwQBlPcJ/QOxedfoMVH0YnhhQ9Ffb0RGA==", 436 | "cpu": [ 437 | "ia32" 438 | ], 439 | "dev": true, 440 | "optional": true, 441 | "os": [ 442 | "win32" 443 | ], 444 | "engines": { 445 | "node": ">=12" 446 | } 447 | }, 448 | "node_modules/esbuild-windows-64": { 449 | "version": "0.15.9", 450 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.9.tgz", 451 | "integrity": "sha512-zm7h91WUmlS4idMtjvCrEeNhlH7+TNOmqw5dJPJZrgFaxoFyqYG6CKDpdFCQXdyKpD5yvzaQBOMVTCBVKGZDEg==", 452 | "cpu": [ 453 | "x64" 454 | ], 455 | "dev": true, 456 | "optional": true, 457 | "os": [ 458 | "win32" 459 | ], 460 | "engines": { 461 | "node": ">=12" 462 | } 463 | }, 464 | "node_modules/esbuild-windows-arm64": { 465 | "version": "0.15.9", 466 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.9.tgz", 467 | "integrity": "sha512-yQEVIv27oauAtvtuhJVfSNMztJJX47ismRS6Sv2QMVV9RM+6xjbMWuuwM2nxr5A2/gj/mu2z9YlQxiwoFRCfZA==", 468 | "cpu": [ 469 | "arm64" 470 | ], 471 | "dev": true, 472 | "optional": true, 473 | "os": [ 474 | "win32" 475 | ], 476 | "engines": { 477 | "node": ">=12" 478 | } 479 | }, 480 | "node_modules/hono": { 481 | "version": "2.2.1", 482 | "resolved": "https://registry.npmjs.org/hono/-/hono-2.2.1.tgz", 483 | "integrity": "sha512-tlawHM4uOMt41jibUF0fRYxUs3vibKzO1Ihuk/MohpUrkRc4fQo1n9+jLRKIC/8d0lLLW/CPWR/iItcf2HUv3A==", 484 | "engines": { 485 | "node": ">=16.0.0" 486 | } 487 | }, 488 | "node_modules/typescript": { 489 | "version": "4.8.3", 490 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", 491 | "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", 492 | "dev": true, 493 | "bin": { 494 | "tsc": "bin/tsc", 495 | "tsserver": "bin/tsserver" 496 | }, 497 | "engines": { 498 | "node": ">=4.2.0" 499 | } 500 | }, 501 | "node_modules/workerd": { 502 | "version": "1.20220926.1", 503 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20220926.1.tgz", 504 | "integrity": "sha512-d1qVw5Kx+DAvkYIsC9XjpgVeL33pdVovw6aaEr7tnXkfGUxzmynKCgcr1Zehvi/ZZBvAgMqMjfi6Hfn25yvvIg==", 505 | "dev": true, 506 | "bin": { 507 | "workerd": "bin/workerd" 508 | }, 509 | "engines": { 510 | "node": ">=16" 511 | }, 512 | "optionalDependencies": { 513 | "@cloudflare/workerd-darwin-64": "^1.20220926.0", 514 | "@cloudflare/workerd-darwin-arm64": "^1.20220926.0", 515 | "@cloudflare/workerd-linux-64": "^1.20220926.0", 516 | "@cloudflare/workerd-linux-arm64": "^1.20220926.0" 517 | } 518 | } 519 | }, 520 | "dependencies": { 521 | "@cloudflare/workerd-darwin-64": { 522 | "version": "1.20220926.0", 523 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20220926.0.tgz", 524 | "integrity": "sha512-NbZ+NOviUvMHv4FLB2dlTIOp8Vh86qVCZEeQjaZ9NHjqKh9uyUEsKDuLIjea5XW+i9jHhyTlh3UQ4r2zcVhB3Q==", 525 | "dev": true, 526 | "optional": true 527 | }, 528 | "@cloudflare/workerd-darwin-arm64": { 529 | "version": "1.20220926.1", 530 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20220926.1.tgz", 531 | "integrity": "sha512-jWVxVsUDggsZPBusmzcj5ZxYjMPWJDfcYvwp2O9IIZaKaYLrr+SIablGxLwSevGxOaFtyTvl+auLBCr+FMLwXw==", 532 | "dev": true, 533 | "optional": true 534 | }, 535 | "@cloudflare/workerd-linux-64": { 536 | "version": "1.20220926.1", 537 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20220926.1.tgz", 538 | "integrity": "sha512-OozSpaj4NrPutxMovKvUojgVtJcHEC1kKgEnmDQgQ0AxdoFKbFxkkHAC1S55rWn969wvf2sKztPSSZ7wZ6Mraw==", 539 | "dev": true, 540 | "optional": true 541 | }, 542 | "@cloudflare/workerd-linux-arm64": { 543 | "version": "1.20220926.1", 544 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20220926.1.tgz", 545 | "integrity": "sha512-PY4mYaKybLlhvkaXEs/wG4mFqmc2FQ71mBWWjUPjpcUe+Zhyhy/viDbq2MhjcryV5o69GPe4jHTVAe/PyKC6BA==", 546 | "dev": true, 547 | "optional": true 548 | }, 549 | "@cloudflare/workers-types": { 550 | "version": "3.16.0", 551 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-3.16.0.tgz", 552 | "integrity": "sha512-gaBUSaKS65mN3iKZEgichbXYEmAa/pXkc5Gbt+1BptYphdGkj09ggdsiE4w8g0F/uI1g36QaTKrzVnBAWMipvQ==", 553 | "dev": true 554 | }, 555 | "@esbuild/android-arm": { 556 | "version": "0.15.9", 557 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.9.tgz", 558 | "integrity": "sha512-VZPy/ETF3fBG5PiinIkA0W/tlsvlEgJccyN2DzWZEl0DlVKRbu91PvY2D6Lxgluj4w9QtYHjOWjAT44C+oQ+EQ==", 559 | "dev": true, 560 | "optional": true 561 | }, 562 | "@esbuild/linux-loong64": { 563 | "version": "0.15.9", 564 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.9.tgz", 565 | "integrity": "sha512-O+NfmkfRrb3uSsTa4jE3WApidSe3N5++fyOVGP1SmMZi4A3BZELkhUUvj5hwmMuNdlpzAZ8iAPz2vmcR7DCFQA==", 566 | "dev": true, 567 | "optional": true 568 | }, 569 | "esbuild": { 570 | "version": "0.15.9", 571 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.9.tgz", 572 | "integrity": "sha512-OnYr1rkMVxtmMHIAKZLMcEUlJmqcbxBz9QoBU8G9v455na0fuzlT/GLu6l+SRghrk0Mm2fSSciMmzV43Q8e0Gg==", 573 | "dev": true, 574 | "requires": { 575 | "@esbuild/android-arm": "0.15.9", 576 | "@esbuild/linux-loong64": "0.15.9", 577 | "esbuild-android-64": "0.15.9", 578 | "esbuild-android-arm64": "0.15.9", 579 | "esbuild-darwin-64": "0.15.9", 580 | "esbuild-darwin-arm64": "0.15.9", 581 | "esbuild-freebsd-64": "0.15.9", 582 | "esbuild-freebsd-arm64": "0.15.9", 583 | "esbuild-linux-32": "0.15.9", 584 | "esbuild-linux-64": "0.15.9", 585 | "esbuild-linux-arm": "0.15.9", 586 | "esbuild-linux-arm64": "0.15.9", 587 | "esbuild-linux-mips64le": "0.15.9", 588 | "esbuild-linux-ppc64le": "0.15.9", 589 | "esbuild-linux-riscv64": "0.15.9", 590 | "esbuild-linux-s390x": "0.15.9", 591 | "esbuild-netbsd-64": "0.15.9", 592 | "esbuild-openbsd-64": "0.15.9", 593 | "esbuild-sunos-64": "0.15.9", 594 | "esbuild-windows-32": "0.15.9", 595 | "esbuild-windows-64": "0.15.9", 596 | "esbuild-windows-arm64": "0.15.9" 597 | } 598 | }, 599 | "esbuild-android-64": { 600 | "version": "0.15.9", 601 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.9.tgz", 602 | "integrity": "sha512-HQCX7FJn9T4kxZQkhPjNZC7tBWZqJvhlLHPU2SFzrQB/7nDXjmTIFpFTjt7Bd1uFpeXmuwf5h5fZm+x/hLnhbw==", 603 | "dev": true, 604 | "optional": true 605 | }, 606 | "esbuild-android-arm64": { 607 | "version": "0.15.9", 608 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.9.tgz", 609 | "integrity": "sha512-E6zbLfqbFVCNEKircSHnPiSTsm3fCRxeIMPfrkS33tFjIAoXtwegQfVZqMGR0FlsvVxp2NEDOUz+WW48COCjSg==", 610 | "dev": true, 611 | "optional": true 612 | }, 613 | "esbuild-darwin-64": { 614 | "version": "0.15.9", 615 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.9.tgz", 616 | "integrity": "sha512-gI7dClcDN/HHVacZhTmGjl0/TWZcGuKJ0I7/xDGJwRQQn7aafZGtvagOFNmuOq+OBFPhlPv1T6JElOXb0unkSQ==", 617 | "dev": true, 618 | "optional": true 619 | }, 620 | "esbuild-darwin-arm64": { 621 | "version": "0.15.9", 622 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.9.tgz", 623 | "integrity": "sha512-VZIMlcRN29yg/sv7DsDwN+OeufCcoTNaTl3Vnav7dL/nvsApD7uvhVRbgyMzv0zU/PP0xRhhIpTyc7lxEzHGSw==", 624 | "dev": true, 625 | "optional": true 626 | }, 627 | "esbuild-freebsd-64": { 628 | "version": "0.15.9", 629 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.9.tgz", 630 | "integrity": "sha512-uM4z5bTvuAXqPxrI204txhlsPIolQPWRMLenvGuCPZTnnGlCMF2QLs0Plcm26gcskhxewYo9LkkmYSS5Czrb5A==", 631 | "dev": true, 632 | "optional": true 633 | }, 634 | "esbuild-freebsd-arm64": { 635 | "version": "0.15.9", 636 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.9.tgz", 637 | "integrity": "sha512-HHDjT3O5gWzicGdgJ5yokZVN9K9KG05SnERwl9nBYZaCjcCgj/sX8Ps1jvoFSfNCO04JSsHSOWo4qvxFuj8FoA==", 638 | "dev": true, 639 | "optional": true 640 | }, 641 | "esbuild-linux-32": { 642 | "version": "0.15.9", 643 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.9.tgz", 644 | "integrity": "sha512-AQIdE8FugGt1DkcekKi5ycI46QZpGJ/wqcMr7w6YUmOmp2ohQ8eO4sKUsOxNOvYL7hGEVwkndSyszR6HpVHLFg==", 645 | "dev": true, 646 | "optional": true 647 | }, 648 | "esbuild-linux-64": { 649 | "version": "0.15.9", 650 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.9.tgz", 651 | "integrity": "sha512-4RXjae7g6Qs7StZyiYyXTZXBlfODhb1aBVAjd+ANuPmMhWthQilWo7rFHwJwL7DQu1Fjej2sODAVwLbcIVsAYQ==", 652 | "dev": true, 653 | "optional": true 654 | }, 655 | "esbuild-linux-arm": { 656 | "version": "0.15.9", 657 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.9.tgz", 658 | "integrity": "sha512-3Zf2GVGUOI7XwChH3qrnTOSqfV1V4CAc/7zLVm4lO6JT6wbJrTgEYCCiNSzziSju+J9Jhf9YGWk/26quWPC6yQ==", 659 | "dev": true, 660 | "optional": true 661 | }, 662 | "esbuild-linux-arm64": { 663 | "version": "0.15.9", 664 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.9.tgz", 665 | "integrity": "sha512-a+bTtxJmYmk9d+s2W4/R1SYKDDAldOKmWjWP0BnrWtDbvUBNOm++du0ysPju4mZVoEFgS1yLNW+VXnG/4FNwdQ==", 666 | "dev": true, 667 | "optional": true 668 | }, 669 | "esbuild-linux-mips64le": { 670 | "version": "0.15.9", 671 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.9.tgz", 672 | "integrity": "sha512-Zn9HSylDp89y+TRREMDoGrc3Z4Hs5u56ozZLQCiZAUx2+HdbbXbWdjmw3FdTJ/i7t5Cew6/Q+6kfO3KCcFGlyw==", 673 | "dev": true, 674 | "optional": true 675 | }, 676 | "esbuild-linux-ppc64le": { 677 | "version": "0.15.9", 678 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.9.tgz", 679 | "integrity": "sha512-OEiOxNAMH9ENFYqRsWUj3CWyN3V8P3ZXyfNAtX5rlCEC/ERXrCEFCJji/1F6POzsXAzxvUJrTSTCy7G6BhA6Fw==", 680 | "dev": true, 681 | "optional": true 682 | }, 683 | "esbuild-linux-riscv64": { 684 | "version": "0.15.9", 685 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.9.tgz", 686 | "integrity": "sha512-ukm4KsC3QRausEFjzTsOZ/qqazw0YvJsKmfoZZm9QW27OHjk2XKSQGGvx8gIEswft/Sadp03/VZvAaqv5AIwNA==", 687 | "dev": true, 688 | "optional": true 689 | }, 690 | "esbuild-linux-s390x": { 691 | "version": "0.15.9", 692 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.9.tgz", 693 | "integrity": "sha512-uDOQEH55wQ6ahcIKzQr3VyjGc6Po/xblLGLoUk3fVL1qjlZAibtQr6XRfy5wPJLu/M2o0vQKLq4lyJ2r1tWKcw==", 694 | "dev": true, 695 | "optional": true 696 | }, 697 | "esbuild-netbsd-64": { 698 | "version": "0.15.9", 699 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.9.tgz", 700 | "integrity": "sha512-yWgxaYTQz+TqX80wXRq6xAtb7GSBAp6gqLKfOdANg9qEmAI1Bxn04IrQr0Mzm4AhxvGKoHzjHjMgXbCCSSDxcw==", 701 | "dev": true, 702 | "optional": true 703 | }, 704 | "esbuild-openbsd-64": { 705 | "version": "0.15.9", 706 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.9.tgz", 707 | "integrity": "sha512-JmS18acQl4iSAjrEha1MfEmUMN4FcnnrtTaJ7Qg0tDCOcgpPPQRLGsZqhes0vmx8VA6IqRyScqXvaL7+Q0Uf3A==", 708 | "dev": true, 709 | "optional": true 710 | }, 711 | "esbuild-sunos-64": { 712 | "version": "0.15.9", 713 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.9.tgz", 714 | "integrity": "sha512-UKynGSWpzkPmXW3D2UMOD9BZPIuRaSqphxSCwScfEE05Be3KAmvjsBhht1fLzKpiFVJb0BYMd4jEbWMyJ/z1hQ==", 715 | "dev": true, 716 | "optional": true 717 | }, 718 | "esbuild-windows-32": { 719 | "version": "0.15.9", 720 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.9.tgz", 721 | "integrity": "sha512-aqXvu4/W9XyTVqO/hw3rNxKE1TcZiEYHPsXM9LwYmKSX9/hjvfIJzXwQBlPcJ/QOxedfoMVH0YnhhQ9Ffb0RGA==", 722 | "dev": true, 723 | "optional": true 724 | }, 725 | "esbuild-windows-64": { 726 | "version": "0.15.9", 727 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.9.tgz", 728 | "integrity": "sha512-zm7h91WUmlS4idMtjvCrEeNhlH7+TNOmqw5dJPJZrgFaxoFyqYG6CKDpdFCQXdyKpD5yvzaQBOMVTCBVKGZDEg==", 729 | "dev": true, 730 | "optional": true 731 | }, 732 | "esbuild-windows-arm64": { 733 | "version": "0.15.9", 734 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.9.tgz", 735 | "integrity": "sha512-yQEVIv27oauAtvtuhJVfSNMztJJX47ismRS6Sv2QMVV9RM+6xjbMWuuwM2nxr5A2/gj/mu2z9YlQxiwoFRCfZA==", 736 | "dev": true, 737 | "optional": true 738 | }, 739 | "hono": { 740 | "version": "2.2.1", 741 | "resolved": "https://registry.npmjs.org/hono/-/hono-2.2.1.tgz", 742 | "integrity": "sha512-tlawHM4uOMt41jibUF0fRYxUs3vibKzO1Ihuk/MohpUrkRc4fQo1n9+jLRKIC/8d0lLLW/CPWR/iItcf2HUv3A==" 743 | }, 744 | "typescript": { 745 | "version": "4.8.3", 746 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", 747 | "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", 748 | "dev": true 749 | }, 750 | "workerd": { 751 | "version": "1.20220926.1", 752 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20220926.1.tgz", 753 | "integrity": "sha512-d1qVw5Kx+DAvkYIsC9XjpgVeL33pdVovw6aaEr7tnXkfGUxzmynKCgcr1Zehvi/ZZBvAgMqMjfi6Hfn25yvvIg==", 754 | "dev": true, 755 | "requires": { 756 | "@cloudflare/workerd-darwin-64": "^1.20220926.0", 757 | "@cloudflare/workerd-darwin-arm64": "^1.20220926.0", 758 | "@cloudflare/workerd-linux-64": "^1.20220926.0", 759 | "@cloudflare/workerd-linux-arm64": "^1.20220926.0" 760 | } 761 | } 762 | } 763 | } 764 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "workerd-example", 3 | "version": "1.0.0", 4 | "description": "This is an example Worker which can be ran with workerd", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "build": "esbuild --format=esm --bundle --outfile=dist/worker.mjs src/index.ts", 9 | "dev": "npm run build && workerd serve config.capnp" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@cloudflare/workers-types": "^3.16.0", 16 | "esbuild": "^0.15.9", 17 | "typescript": "^4.8.3", 18 | "workerd": "^1.20220926.1" 19 | }, 20 | "dependencies": { 21 | "hono": "^2.2.1" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/create.ts: -------------------------------------------------------------------------------- 1 | import { HonoContext } from "hono/dist/context"; 2 | 3 | interface RequestBody { 4 | slug?: string; 5 | destination?: string; 6 | } 7 | 8 | const createRedirect = async (c: HonoContext) => { 9 | const body = await c.req.json(); 10 | 11 | if (!body.slug || !body.destination) { 12 | return c.json({ error: "Missing slug or destination!" }); 13 | } 14 | 15 | await c.env.KV.put(body.slug, body.destination); 16 | 17 | return c.json({ message: "Created redirect!" }); 18 | }; 19 | 20 | export default createRedirect; 21 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Hono } from "hono"; 2 | import createRedirect from "./create"; 3 | import handleRedirect from "./redirect"; 4 | 5 | const app = new Hono(); 6 | 7 | app.get("*", handleRedirect); 8 | app.post("/create", createRedirect); 9 | 10 | export default app; 11 | -------------------------------------------------------------------------------- /src/redirect.ts: -------------------------------------------------------------------------------- 1 | import { HonoContext } from "hono/dist/context"; 2 | 3 | const handleRedirect = async (c: HonoContext) => { 4 | try { 5 | const { pathname } = new URL(c.req.url); 6 | const path = pathname.slice(1); 7 | 8 | const destination = await c.env.KV.get(path); 9 | if (destination === null) { 10 | c.status(404); 11 | return c.json({ error: "Not found!" }); 12 | } 13 | 14 | return c.redirect(destination); 15 | } catch (e) { 16 | return c.json({ 17 | error: "exception caught! Message: " + e.message, 18 | stack: e.stack, 19 | }); 20 | } 21 | }; 22 | 23 | export default handleRedirect; 24 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "CommonJS", 5 | "lib": ["ES2020"], 6 | "types": ["@cloudflare/workers-types"] 7 | } 8 | } 9 | --------------------------------------------------------------------------------