Skip to content

Instantly share code, notes, and snippets.

@mizchi
Last active August 29, 2015 14:18
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mizchi/89a3f86f0d7d95619822 to your computer and use it in GitHub Desktop.
Save mizchi/89a3f86f0d7d95619822 to your computer and use it in GitHub Desktop.
REST API in ServiceWorker

ServiceWorkerハッカソンにて

自己紹介

@mizchi です

今日のコンセプト

  • Isormorphic Web Application Framework
  • serviceworker内にexpress(nodeのwaf)いてほしくない…?

考えられる用途

  1. オフライン環境でキャッシュを返す
  2. サーバーをスキップしてパフォーマンス向上
  3. テスト用モックサーバー
  4. ServiceWorker未対応ブラウザのフォールバック

どこまで実装するか

  • 完全にexpressのAPIを模倣するのきつすぎ
  • 規約ベースのrouter書いて、それをどの環境でも動かせるようにする方向に

実装した

Sabizan

  • サビ残
  • github.com/mizchi/sabizan

こんなルーターを書く

routes.coffee

module.exports = (router) ->
  router.get '/users/:id', (req) ->
    {id: req.params.id}

  router.post '/post', (req) ->
    new Promise (done) ->
      setTimeout ->
        done {type: 'this is post:' + req.body.prop}
      , 100

ServiceWorkerで有効化する

Sabizan = require 'sabizan'
self.onfetch = (event) ->
  if proxy.isHandleScope event.request.url
    proxy.wrapFetchEvent(event)
sabizan = new Sabizan.ServiceWorker location.origin+'/api'
require('./routes')(sabizan)

browserifyして使う

Expressで有効化する

app = express()
Sabizan = require '../src/index'
proxy = new Sabizan.Server app, '/api'
require('./routes')(proxy)

今日作ったのは主にここ

req: Sabizan.Requestの仕様

基本的にはexpress準拠

req.params req.body req.query

デモ

どっちでも同じように動く。 地味です。

これからやりたいこと

DB

  • PouchDBと一緒に使えるようにする
    • CouchDBとレプリケーションできるIndexedDbラッパー

PushAPIでレプリケーション開始フラグをたてる

サーバー側に副作用があるときにPush API で通知してレプリケーション

選択的な応答

  • APIごとに選択的に何がレスポンスに応えるか選べるようにする
    • 副作用が起きる系の操作はServiceWorkerでPOSTできないようにするとか

簡易テストランナー

DBスタブして入力と出力の対応だけみるテストすればすごいテストしやすそう

こう

夢しかない

DBとレプリケーション通知は夢があるのであとでやるぞ!

最後に

/etc/hosts をどうにかして自分と無関係なサイトに対して勝手にserviceworker登録してリクエストをスタブするの楽しそうな気がしてきた

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment