curveball -タイプスクリプトのマイクロフレームワーク


2011年半ば以来、私たちは新しいマイクロフレームワークに取り組んでいます.フレームワークはExpress , からインスピレーションを受けるKoa . それはCurveball .
あなたがExpressでこれまでに働いたならば、私はほとんどの人々のために、このプロジェクトが劇的なステップアップのように感じると感じます.Expressは本当にノードの以前の時刻に書かれました.JSは、約束する前に、async/waitは平凡だったので、第一に、最大の変更は、Async/Waitミドルウェアの使用です.
あなたがKOAから来たならば、それはすでによく知られています.KOAに比べて、これらは大きな違いです.
  • curveballはタイプスクリプトで書かれている
  • それは強力な組み込みサポートのHTTP/2プッシュしています.
  • 使用せずにAWSラムダ上で実行中のサーバーのネイティブサポート
    strange hacks .
  • Curveballの要求/応答オブジェクトは、ノードから切り離されます.jshttp図書館.
  • アットBad Gateway 私たちは様々な(ほとんどAPI)でこれを使用してきました
    過去数年間のプロジェクト、そしてそれは本当に私たちのために働いている.
    また、それはかなり'粘着性の製品である傾向があることを発見している.それにさらされる人々は、あまりにも彼らの次のプロジェクトのためにそれを使用したい傾向があります.
    奇妙な?ここでは一般的なタスクの例を示します.


    ハローワールド


    import { Application } from '@curveball/core';
    
    const app = new Application();
    app.use( async ctx => {
      ctx.response.type = 'text/plain';
      ctx.response.body = 'hello world';
    });
    
    app.listen(80);
    
    すべてはミドルウェアであり、ミドルウェアはasync .

    ハローワールドで


    import { Application } from '@curveball/core';
    import { handler } from '@curveball/aws-lambda';
    
    const app = new Application();
    app.use( ctx => {
      ctx.response.type = 'text/plain';
      ctx.response.body = 'hello world';
    });
    
    exports.handler = handler(app);
    

    HTTPプッシュ


    const app = new Application();
    app.use( ctx => {
      ctx.response.type = 'text/plain';
      ctx.body = 'hello world';
    
      ctx.push( pushCtx => {
    
        pushCtx.path = '/sub-item';
        pushCtx.response.type = 'text/html';
        pushCtx.response.body = '<h1>Automatically pushed!</h1>';
    
      });
    
    
    });
    
    コールバックctx.push pushがクライアントによってサポートされている場合にのみ呼び出され、新しいコンテキストを作成するため、すべてのミドルウェアを'サブリクエスト'を行うことによってすべてのミドルウェアに接続することができます.

    資源ベースコントローラ


    コントローラは任意であり、独断的です.単一のコントローラは、1つのタイプのリソース、または1つのルートを管理する必要があります.
    import { Application, Context } from '@curveball/core';
    import { Controller } from '@curveball/controller';
    
    const app = new Application();
    
    class MyController extends Controller {
    
      get(ctx: Context) {
    
        // This is automatically triggered for GET requests
    
      }
    
      put(ctx: Context) {
    
        // This is automatically triggered for PUT requests
    
      }
    
    }
    
    app.use(new MyController());
    

    ルーティング


    推奨パターンは、ルートごとに1つのコントローラを使用することです.
    import { Application } from '@curveball/core';
    import router from '@curveball/router';
    
    const app = new Application();
    
    app.use(router('/articles', new MyCollectionController());
    app.use(router('/articles/:id', new MyItemController());
    

    コントローラにおけるコンテンツネゴティング


    import { Context } from '@curveball/core';
    import { Controller, method, accept } from '@curveball/controller';
    
    class MyController extends Controller {
    
      @accept('html')
      @method('GET')
      async getHTML(ctx: Context) {
    
        // This is automatically triggered for GET requests with
        // Accept: text/html
    
      }
    
      @accept('json')
      @method('GET')
      async getJSON(ctx: Context) {
    
        // This is automatically triggered for GET requests with
        // Accept: application/json
    
      }
    
    }
    

    エラーの発生


    HTTPエラーを出力するには、ctx.status , しかし、単に関連する例外をスローするのは簡単です.
    function myMiddleware(ctx: Context, next: Middleware) {
    
      if (ctx.method !== 'GET') {
        throw new MethodNotAllowed('Only GET is allowed here');
      }
      await next();
    
    }
    
    プロジェクトも、Aで出荷しますmiddleware 自動的に生成するRFC7807 application/problem+json 応答

    ミドルウェアにおけるHTTP応答の変換


    Express MiddleWareで、リクエストが処理される前に何かを行うのは簡単ですが、ミドルウェアでレスポンスを変換したい場合は、これは複雑なハックを通してのみ達成できます.
    これは応答がすぐにTCPソケットに書かれていて、ソケットに書き込まれたならば、それは効果的になくなります.
    したがって、Gzipping応答のようなことをするために、Express Middleware作者は応答ストリームを偽造して、それに送られたどんなバイトも妨害する必要があります.これは明示的な圧縮ソースで明らかになります.
    https://github.com/expressjs/compression/blob/master/index.js .
    カーブボールはこれをしない.応答体はバッファリングされ、
    ミドルウェア
    たとえば、次のミドルウェアはHTTPアクセプトヘッダーtext/html そして、自動的にJSONを単純なHTML出力に変換します.
    app.use( async (ctx, next) => {
    
      // Let the entire middleware stack run
      await next();
    
      // HTML encode JSON responses if the client was a browser.
      if (ctx.accepts('text/html') && ctx.response.type ==== 'application/json') {
        ctx.response.type = 'text/html';
        ctx.response.body = '<h1>JSON source</h1><pre>' + JSON.stringify(ctx.response.body) + '</pre>';
      }
    
    });
    
    急行で同じことを成し遂げるのはかなり複雑だ.
    大きなファイルに対してパフォーマンスが悪いかどうか疑問に思うかもしれません.あなたは完全に正しいでしょう.
    しかし、出力ストリームに直接書き込む代わりに、ユーザは、body プロパティを実行するので、ボディを書き込むことはバッファされません.これらのミドルウェアを実装する複雑さは変わりません.

    HTML APIブラウザ


    カーブボールもAPI browser 自動的に変換
    トランタブルHTMLにJSON、自動的にHALリンクとHTTPリンクを解析
    ヘッダ.
    すべてのナビゲーション要素は、
    レスポンス.
    使用する:
    import { halBrowser } from 'hal-browser';
    import { Application } from '@curveball/core';
    
    const app = new Application();
    app.use(halBrowser());
    
    一度設定すると、ブラウザによってアクセスされたときにAPIがレンダリングされます.

    情報応答の送信


    ctx.response.sendInformational(103, {
      link: '</foo>; rel="preload"'
    })
    

    ヘッダの優先解析


    const foo = ctx.request.prefer('return');
    // Could be 'representation', 'minimal' or false
    console.log(foo);
    

    インストールとリンク


    インストール
    npm i @curveball/core
    
    ドキュメントはGithub . ミドルウェアのリストはorganization page .

    安定放流


    我々は現在11番目のベータ版であり、安定したリリースでの閉鎖.この時点で変更はマイナーになります.
    あなたがこのプロジェクトの考えまたはフィードバックをするならば、それは聞くのに本当に役に立つでしょう.コメント、質問や提案を残すことを躊躇しないでくださいGithub Issue .
    まだ行われている大きなことはwebsite . 我々は素晴らしいデザインを得た、それだけでフィニッシュラインをプッシュする必要があります.

    もう一つ?


    Clichのヘッダーの謝罪.また、Curveballで書かれたAuthencationサーバーにも取り組んでいます.次のように処理します.
  • ログイン
  • 登録
  • ロストパスワード
  • OAuS 2 :
  • client_credentials , password , authorization_code グラントタイプ.
  • Revoke , Introspectのサポート
  • totp ( Google Authenticatorのスタイル)
  • ユーザー管理、特権管理.
  • プロジェクトは、ユーザーエクスペリエンス部門でいくつかの愛が必要ですが、別の認証システムを作成し、銀行を破るしたくない場合は.a12n-server あなたのためかもしれない.
    ここでの最終的な目標は、偉大なヘッドホン認証サーバを作成し、OAuth 0とOktaと競合することです.