🧁 An object-oriented Gemini server for Deno!
gemini-protocol deno typescript gemini
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(decorators): auto deduce callback type

Fuwn 3dc5aaa6 0ce99108

+38 -8
+1 -1
README.md
··· 43 43 } from "https://deno.land/x/laurali/mod.ts"; 44 44 45 45 class MyCoolServer extends Server { 46 - /** Visit /hi */ 46 + /** Visit `/hi` */ 47 47 @route() 48 48 hi() { 49 49 return "Hello, World!";
+4 -4
examples/my_cool_server.ts
··· 16 16 // Copyright (C) 2022-2022 Fuwn <contact@fuwn.me> 17 17 // SPDX-License-Identifier: GPL-3.0-only 18 18 19 - import { Callback, callback, route, Server } from "../mod.ts"; 19 + import { callback, route, Server } from "../mod.ts"; 20 20 import * as optic from "https://deno.land/x/optic@1.3.5/mod.ts"; 21 21 22 22 /** Implement a new Laurali server */ ··· 50 50 return MyCoolServer.clicks; 51 51 } 52 52 53 - @callback(Callback.ON_PRE_ROUTE) 53 + @callback() 54 54 override onPreRoute(ctx: Deno.TlsConn) { 55 55 MyCoolServer.clicks += 1; 56 56 ··· 60 60 ); 61 61 } 62 62 63 - @callback(Callback.ON_POST_ROUTE) 63 + @callback() 64 64 override onPostRoute() { 65 65 MyCoolServer.logger.info("Closed connection."); 66 66 } 67 67 68 - @callback(Callback.ON_ERROR) 68 + @callback() 69 69 override onError() { 70 70 return "hi"; 71 71 }
+33 -3
laurali/decorators.ts
··· 39 39 * Mark the function as a callback and register it to the `Server`. 40 40 * @param callback The type of callback which the function will be called for. 41 41 */ 42 - export const callback = (callback: Callback) => { 42 + export const callback = (callback?: Callback) => { 43 43 return ( 44 44 // deno-lint-ignore no-explicit-any 45 45 target: any, 46 - _key: string | symbol, 46 + key: string | symbol, 47 47 descriptor: PropertyDescriptor, 48 48 ) => { 49 - target.addCallback(callback, descriptor.value); 49 + let type; 50 + 51 + if (callback) { 52 + type = callback; 53 + } else { 54 + switch (key) { 55 + case "onPreRoute": 56 + { 57 + type = Callback.ON_PRE_ROUTE; 58 + } 59 + break; 60 + case "onPostRoute": 61 + { 62 + type = Callback.ON_POST_ROUTE; 63 + } 64 + break; 65 + case "onError": 66 + { 67 + type = Callback.ON_ERROR; 68 + } 69 + break; 70 + default: { 71 + throw new Error( 72 + `Unknown callback type: '${key.toString()}'. Did you forget to ` + 73 + "specify the callback type?`", 74 + ); 75 + } 76 + } 77 + } 78 + 79 + target.addCallback(type, descriptor.value); 50 80 51 81 return descriptor; 52 82 };